原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/term-vs-full-text.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/term-vs-full-text.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/term-vs-full-text.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
基于词项与基于全文edit
所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段。和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以划分成两大家族:
- 基于词项的查询
-
如
term或fuzzy这样的底层查询不需要分析阶段,它们对单个词项进行操作。用term查询词项Foo只要在倒排索引中查找 准确词项 ,并且用 TF/IDF 算法为每个包含该词项的文档计算相关度评分_score。记住
term查询只对倒排索引的词项精确匹配,这点很重要,它不会对词的多样性进行处理(如,foo或FOO)。这里,无须考虑词项是如何存入索引的。如果是将["Foo","Bar"]索引存入一个不分析的(not_analyzed)包含精确值的字段,或者将Foo Bar索引到一个带有whitespace空格分析器的字段,两者的结果都会是在倒排索引中有Foo和Bar这两个词。 - 基于全文的查询
-
像
match或query_string这样的查询是高层查询,它们了解字段映射的信息:-
如果查询
日期(date)或整数(integer)字段,它们会将查询字符串分别作为日期或整数对待。 -
如果查询一个(
not_analyzed)未分析的精确值字符串字段,它们会将整个查询字符串作为单个词项对待。 -
但如果要查询一个(
analyzed)已分析的全文字段,它们会先将查询字符串传递到一个合适的分析器,然后生成一个供查询的词项列表。
一旦组成了词项列表,这个查询会对每个词项逐一执行底层的查询,再将结果合并,然后为每个文档生成一个最终的相关度评分。
我们将会在随后章节中详细讨论这个过程。
-
如果查询
我们很少直接使用基于词项的搜索,通常情况下都是对全文进行查询,而非单个词项,这只需要简单的执行一个高层全文查询(进而在高层查询内部会以基于词项的底层查询完成搜索)。
当我们想要查询一个具有精确值的 not_analyzed 未分析字段之前,需要考虑,是否真的采用评分查询,或者非评分查询会更好。
单词项查询通常可以用是、非这种二元问题表示,所以更适合用过滤,而且这样做可以有效利用缓存:
GET /_search
{
"query": {
"constant_score": {
"filter": {
"term": { "gender": "female" }
}
}
}
}