我刚刚开始使用Elasticsearch,我必须使用同事生成的数据。我注意到每个String数据都是一个全文值:
{
"countryId": {
"type": "string"
}
但我们永远不需要进行全文搜索,因此使用过滤搜索的精确值非常好。唯一的问题是,由于时间不够,这些值的类型暂时无法改变。
所以我的问题是:如果我对全文值进行基于过滤器的搜索,会发生什么?是否会像使用match
搜索那样分析搜索条件,或者过滤器会忽略此值的全文类型并将其作为精确值处理,从而节省了大量搜索时间,因为过滤器是真的很快?
我查看了文档,但无法得到明确的答案。
答案 0 :(得分:2)
您可能已经凭经验观察到尝试此操作时会发生什么,但为了使term
过滤器按预期运行(与指定字段中的指定参数完全匹配),索引的映射必须定义字段的index
属性为not_analyzed
。 term
过滤器的官方文档为here,但最直接相关的部分可能是:
过滤包含字词(未分析)的字段的文档。
因此,您的索引应该具有与以下内容类似的映射:
{"mappings" : {"the_document_type": {
"countryId" : {"type" : "string", "index" : "not_analyzed"},
...
... Mappings for other fields in your document
...
}}}
鉴于上面的代码段,包含term
过滤器的查询应该成功,该过滤器要求文档与countryId
的某些指定参数完全匹配。如下所示:
{"query" : {"filtered" :
"query" : {"match_all" : {}},
"filter" : {"term" : {"countryId" : "Kingdom of Anvilania"}}
}}
Elasticsearch here中还有string
类型(以及所有其他核心类型)的进一步文档,但有关index
属性的具体部分是:
设置为分析要使用分析器分解为令牌后要编入索引和可搜索的字段。 not_analyzed意味着它仍然可以搜索,但不会通过任何分析过程或分解为令牌。并不意味着它根本不可搜索(作为一个单独的领域;它可能仍然包含在_all中)。设置为no禁用include_in_all。默认为分析。