5

{"query":{ "match" : { "content" : "2" } }}匹配所有文档的全部内容包含数字 2,但是我希望内容正好是 2,不多不少 - 以 Java 的 String.equals 的精神思考我的要求。

同样,对于第二个查询,我想匹配文档的内容恰好是“3 3”并且仅此而已。{"query":{ "match" : { "content" : "3 3" } }}

如何在 Elasticsearch 中进行精确(String.equals)匹配?

4

2 回答 2

3

如果没有看到您的索引类型映射和示例数据,很难直接回答这个问题 - 但我会尝试。

顺便说一句,我想说这类似于这里的答案(https://stackoverflow.com/a/12867852/382774),您只需在映射中将该content字段的index选项设置为:not_analyzed

"url" : {
    "type" : "string", 
    "index" : "not_analyzed"
}

编辑:我对我的原始答案不够清楚,如上所示。我并不是要暗示您应该将示例代码添加到您的查询中,我的意思是您需要在索引类型映射中指定该url字段是类型string并且它被索引但不被分析(not_analyzed)。

这告诉 Elasticsearch 在您为文档编制索引时不要费心分析(标记化或标记过滤)该字段 - 只需将其存储在文档中存在的索引中即可。有关映射的更多信息,请参阅http://www.elasticsearch.org/guide/reference/mapping/了解介绍,了解http://www.elasticsearch.org/guide/reference/mapping/core-types/了解详情not_analyzed(提示:在该页面上搜索它)。

更新:

官方文档告诉我们,在新版本的 Elastic 搜索中,您不能将变量定义为“not_analyzed”,而应使用“关键字”。

对于旧版本的弹性:

{
  "foo": {
    "type" "string",
    "index": "not_analyzed"
  }

}

对于新版本:

{
  "foo": {
    "type" "keyword",
    "index": true
  }
}

请注意,此功能(关键字类型)来自 elastic 5.0,并且从 Elasticsearch 6.0 版本中删除了向后兼容层。

于 2013-08-09T17:59:36.837 回答
2

官方文件

您应该使用过滤器而不是匹配。

{
"query" : {
    "constant_score" : { 
        "filter" : {
            "term" : { 
                "content" : 2
            }
        }
    }
}

你得到的文档的内容是精确的 2,而不是 20 或 2.1

于 2016-11-01T07:46:15.823 回答