Elasticsearch:Combined fields 查询

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:Combined fields 查询相关的知识,希望对你有一定的参考价值。

有时一个匹配项可以覆盖多个文本字段。 在这种情况下,你可以使用 combined_fields 查询来搜索多个文本字段,就好像它们的值实际上已被索引到一个组合字段中一样。 除此之外,combined_fields 的主要好处是强大且易于理解的评分算法。这种做法也有类似于 copy_to​​​​​​​ 的处理方法。

combined_fields 查询属于全文查询组,它允许你搜索已分析的文本字段(例如,错误消息)。

当字段映射中没有指定 search_analyzer 时,分析器将默认为索引时应用于该字段的分析器,并使用该分析器来处理查询字符串。 如果在字段映射中指定了 search_analyzer,则此分析器将是用于处理查询字符串的分析器。

分析器只是一个由三个更小的组件构建而成的组件:字符过滤器、标记器和标记过滤器,无论是内置的还是自定义的。 这些构建块被内置的分析器预先打包到各种语言和各种文本的分析器中。 Elasticsearch 还公开了各个构建块,允许将它们合并以创建新的自定义分析器。 你可以在此处阅读有关分析器的更多信息。

combined fields 查询支持搜索多个文本字段,就好像它们的内容已被索引到一个组合字段中一样。 该查询采用把输入字符串当做以 term 为中心的输入:首先它将查询字符串分析为单独的 term,然后在任何字段中查找每个词。 当匹配可能跨越多个文本字段(例如文章的 title、abstract 和 body)时,此查询特别有用。比如我们写入如下的一个文档:

PUT combined_index/_doc/1

  "title": "Elasticsearch database is very useful",
  "abstract": "This is a very popular system nowadays",
  "body": "Elasticsearch is today one of the most popular database systems available today. This Elasticsearch tutorial provides new users with the prerequisite knowledge and tools to start using Elasticsearch. It includes installation instructions, and initial indexing and data handling instructions."

我们可以使用如下的搜索来针对 tille, abstract 及 body 同时进行查询:

GET combined_index/_search?filter_path=**.hits

  "query": 
    "combined_fields": 
      "query": "database systems",
      "fields": ["title", "abstract", "body"],
      "operator": "and"
    
  

上面命令搜索返回的结果为:


  "hits": 
    "hits": [
      
        "_index": "combined_index",
        "_id": "1",
        "_score": 0.6877647,
        "_ignored": [
          "body.keyword"
        ],
        "_source": 
          "title": "Elasticsearch database is very useful",
          "abstract": "This is a very popular system nowadays",
          "body": "Elasticsearch is today one of the most popular database systems available today. This Elasticsearch tutorial provides new users with the prerequisite knowledge and tools to start using Elasticsearch. It includes installation instructions, and initial indexing and data handling instructions."
        
      
    ]
  

乍一看,是不是有点觉得像 mulit-match 查询的样子啊?这在我们下面来进行比较。

combined_fields 查询采用基于概率相关性框架:BM25 及以后中描述的简单 BM25F 公式的原则性评分方法。 在对匹配项进行评分时,查询会跨字段组合术语和集合统计信息来对每个匹配项进行评分,就好像指定字段已被索引到单个组合字段中一样。 这个得分是最好的尝试; combined_fields 做了一些近似,分数不会完全服从 BM25F 模型。

警告:字段数量限制。默认情况下,查询可以包含的子句数量是有限制的。 此限制由 indices.query.bool.max_clause_count 设置定义,默认为 4096。对于combined fileds 查询,子句数计算为字段数乘以术语数。

这个查询有什么用?

combined_fields 查询使你能够搜索多个文本字段,就好像它们的索引值已被索引到一个组合字段中一样。 combined_fields 查询在匹配可能涵盖多个文本字段时很方便。

combined_fields 查询通过采用以 term 为中心的查询视图来工作。 它将查询字符串分析为单个术语,然后在任何字段中搜索每个术语。 可以使用此查询代替跨字段 multi_match 查询。 它提供了更直接的行为和更强大的评分系统。 combined_fields 查询仅适用于具有完全相同的搜索分析器的字段,而 multi_match 查询不关心字段是否具有相同的搜索分析器。

字段分数加权

字段分数加权是 combined fields 模型而定的。 例如,如果标题 title 的提升为 2,则计算分数时就好像 title 中的每个术语在合成组合字段中出现了两次一样。

GET /_search

  "query": 
    "combined_fields" : 
      "query" : "distributed consensus",
      "fields" : [ "title^2", "body" ] 
    
  

如上所示,当我们想对 title 字段进行加权时,我们可以使用 ^ 符号来进行表述。

注意:combined_fields 查询要求字段提升大于或等于 1.0。 字段增强允许是浮点数,比如 2.2 等。

combined_fields 的参数


fields

       (必需,字符串数组)要搜索的字段列表。 允许字段通配符模式。 仅支持文本字段,并且它们必须都具有相同的搜索分析器。

query
        (必需,字符串)要在提供的 <fields> 中搜索的文本。

        combined_fields 查询在执行搜索之前分析提供的文本。

auto_generate_synonyms_phrase_query
        (可选,布尔值)如果为真,则会自动为 multi-term 同义词创建 match phrase 查询。默认为 true。

        有关系的例子,请参看 Use synonyms with match query

Operator

        (可选,字符串)布尔逻辑,用于解释查询值中的文本。 有效值为:

                or(默认)
                        例如,database systems 的查询值被解释为 database OR systems
                and
                        例如,database systems 的查询值被解释为 database AND systems

minimum_should_match
        (可选,字符串)要返回的文档必须匹配的最小子句数。 有关有效值和更多信息,请参阅 minimum_should_match 参数。

zero_terms_query

        (可选,字符串)指示如果分析器删除所有分词时是否不返回任何文档,例如在使用 stop 过滤器时。 有效值为:

          none(默认)
                如果分析器删除所有分词,则不会返回任何文档。
         all
                返回所有文档,类似于 match_all 查询。
                有关示例,请参见 Zero terms query 。

和 multi-match 查询比较

combined_fields 查询提供了一种跨多个文本字段进行匹配和评分的原则性方法。 为了支持这一点,它要求所有字段都具有相同的搜索分析器

如你想要一个处理不同类型字段(如 keyword 或 numbers)的查询,那么 multi_match 查询可能更合适。 它支持文本和非文本字段,并接受不共享同一分析器的文本字段。

主要的 multi_match 模式 best_fieldsmost_fields 采用以字段为中心的查询视图。 相比之下,combined_fields 是以 term 为中心的:operator 和 minimum_should_match 应用于每个 term,而不是每个字段。 具体来说,像这样的查询:

GET /_search

  "query": 
    "combined_fields" : 
      "query":      "database systems",
      "fields":     [ "title", "abstract"],
      "operator":   "and"
    
  

被执行为:

+(combined("database", fields:["title" "abstract"]))
+(combined("systems", fields:["title", "abstract"]))

换句话说,每个术语必须出现在至少一个字段中才能匹配文档。

cross_fields multi_match 模式也采用以术语为中心的方法,并为每个术语应用 operator 和 minimum_should_match。 combined_fields 相对于 cross_fields 的主要优势是其基于 BM25F 算法的强大且可解释的评分方法。

注意:Custom similarities
combined_fields 查询目前只支持 BM25 相似度,这是默认的,除非配置了 Custom similaritiesPer-field similarities 也是不允许的。 在任何一种情况下使用 combined_fields 都会导致错误。

以上是关于Elasticsearch:Combined fields 查询的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:了解 Elasticsearch combined fields 和 multi match 查询

Elasticsearch 报错:Fielddata is disabled on text fields by default. Set `fielddata=true` on [`your_fi

ElasticSearch 聚合嵌套查询

Elasticsearch 5.4.3 聚合分组

bootstrap-combined.min.css 与 bootstrap.css冲突

不替代自然评分的 ElasticSearch 自定义脚本评分