Elasticsearch中的精确(非子串)匹配

时间:2013-08-08 23:41:23

标签: elasticsearch

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

类似地,对于第二个查询,我想匹配文档的内容正好是'3 3'并且没有或多或少。 {"query":{ "match" : { "content" : "3 3" } }}

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

2 个答案:

答案 0 :(得分:3)

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

Offhand,我会说这与此处的答案类似(https://stackoverflow.com/a/12867852/382774),您只需在映射中将content字段的index选项设置为not_analyzed

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

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

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

<强>更新

Official doc告诉我们,在新版本的弹性搜索中,您无法将变量定义为“not_analyzed”,而应使用“keyword”。

对于旧版弹性:

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

}

对于新版本:

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

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

答案 1 :(得分:2)

Official Doc

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

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

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