我知道Elastic会使用“关键字”类型来查找完全匹配的内容。例如:
"address": { "type": "keyword"}
太酷了。完全匹配的作品!
但我想同时具有两者和“ 完全匹配”和“ 子字符串”。因此,我决定创建以下映射:
"address": { "type": "text" , "index": true }
问题 如果我使用“文本”类型,如何搜索完全匹配的字符串? (不是子字符串)。我已经尝试了几种方法,但是没有用:
GET testing_index/_search
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"address" : "washington"
}
}
}
}
}
或
GET testing_index/_search
{
"query": {
"match": {
"address" : "washington"
}
}
}
我只需要通用映射:
我希望弹性能做到这一点。
答案 0 :(得分:1)
默认情况下,文本字段使用default analyzer,它会删除大多数标点符号,将文本分解成单个单词,并将它们小写。例如,标准分析器会将字符串“ Quick Brown Fox!”转换为术语[{quick
,brown
,fox
]。可以想象,这使得很难针对文本字段编写完全匹配查询。对于您的用例,我建议使用以下两个选项之一:
keyword
,并使用wildcard或fuzzy查询完成类似子字符串的匹配。众所周知,通配符查询(尤其是带有前导通配符的查询)速度较慢,因此请谨慎操作。keyword
,另一次为text
。明显的缺点是索引的大小膨胀。有关更多背景信息,请参见“术语查询” Elasticsearch文档,尤其是“为什么术语查询不匹配我的文档?”一节:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html