{"query":{
"match" : {
"content" : "2"
}
}}
匹配所有文档,整个内容包含数字2,但是我希望内容正好是2,不多也不少 - 按照Java的String.equals的精神考虑我的要求。
类似地,对于第二个查询,我想匹配文档的内容正好是'3 3'并且没有或多或少。 {"query":{
"match" : {
"content" : "3 3"
}
}}
我如何在Elasticsearch中进行精确(String.equals)匹配?
答案 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)
您应该使用过滤器而不是匹配。
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"content" : 2
}
}
}
}
你得到的文件的内容是精确的2,而不是20或2.1