当前位置: 首页 > article >正文

深度分析 es multi_match 中most_fields、best_fields、cross_fields区别

文章目录

      • 1. `multi_match` 查询的类型
        • 1.1 `best_fields`(默认)
        • 1.2 `most_fields`
        • 1.3 `cross_fields`
      • 2. 不同类型的示例
        • 查询示例数据:
      • 3. 示例 1: 使用 `best_fields`
        • 查询:
        • 说明:
      • 4. 示例 2: 使用 `most_fields`
        • 查询:
        • 说明:
      • 5. 示例 3: 使用 `cross_fields`
        • 查询:
        • 说明:
      • 6. 返回的结果对比
      • 7. 总结对比
      • 8. 总结

Elasticsearch 中,multi_match 查询是用来在多个字段中查找匹配的文本。它有不同的 type(类型),例如 most_fieldsbest_fieldscross_fields,这些类型在多字段查询时的匹配策略不同。了解这些类型的区别有助于在不同的场景下做出正确的查询选择。

1. multi_match 查询的类型

1.1 best_fields(默认)

best_fields默认类型。它在多个字段上查找匹配项,并返回与单个字段最匹配的结果。也就是说,ES 会计算每个字段的相关性,然后返回最佳的字段匹配结果。

  • 适用场景:当你希望查询中的单个字段更重要时,best_fields 适合。
  • 匹配逻辑:多个字段参与查询,但只会选取最好的字段结果。
1.2 most_fields

most_fields 会把多个字段的匹配结果合并到一起,计算最匹配的字段的相关性。每个字段会被视为一个独立的匹配源,并且它们的分数会累加在一起。

  • 适用场景:当你希望多个字段的匹配对结果有较大影响时,most_fields 适合。
  • 匹配逻辑:多个字段的匹配结果累加,最终的得分是字段得分的总和。
1.3 cross_fields

cross_fields 适用于对多个字段中的数据进行组合查询。它将多个字段合并在一起,类似于一个字段查询。这对于多字段中包含相同概念的情况(例如多个单词分布在不同的字段)尤其有用。

  • 适用场景:当你希望将多个字段视为同一个字段的组合时,cross_fields 适合。
  • 匹配逻辑:多个字段被视为一个大的字段进行匹配。

2. 不同类型的示例

假设你有一个包含以下字段的 products 索引:

{
  "product_name": "Wireless Mouse",
  "description": "A wireless mouse with ergonomic design",
  "category": "Electronics"
}

你想要对这几个字段进行查询,可以使用 multi_match 来搜索多个字段。

查询示例数据:
POST /products/_bulk
{ "index": { "_id": 1 } }
{ "product_name": "Wireless Mouse", "description": "A wireless mouse with ergonomic design", "category": "Electronics" }
{ "index": { "_id": 2 } }
{ "product_name": "Wired Keyboard", "description": "A keyboard with ergonomic design", "category": "Electronics" }
{ "index": { "_id": 3 } }
{ "product_name": "Wireless Keyboard", "description": "Wireless keyboard for gaming", "category": "Electronics" }

3. 示例 1: 使用 best_fields

best_fields 是默认类型,表示从多个字段中选取相关性最强的字段。

查询:
POST /products/_search
{
  "query": {
    "multi_match": {
      "query": "wireless mouse",
      "fields": ["product_name", "description"],
      "type": "best_fields"
    }
  },
  "explain": true
}
说明:

在这里插入图片描述

  • 这个查询会在 product_namedescription 字段上查找匹配,并根据相关性返回最佳的字段匹配结果。
  • 如果 product_name 字段匹配度最高,ES 会选择 product_name 字段作为最终匹配字段。

4. 示例 2: 使用 most_fields

most_fields 会将多个字段的相关性累加。

查询:
POST /products/_search
{
  "query": {
    "multi_match": {
      "query": "wireless mouse",
      "fields": ["product_name", "description"],
      "type": "most_fields"
    }
  },
  "explain": true
}
说明:

在这里插入图片描述

  • 这个查询会把 product_namedescription 两个字段的匹配结果合并,计算它们的总相关性,并返回结果。
  • 比如,product_namedescription 都与查询的 wireless mouse 匹配时,它们的相关性分数会被加在一起。

5. 示例 3: 使用 cross_fields

cross_fields 用于处理多个字段中包含的同一概念时,可以把它们当作一个大的字段进行匹配。

查询:
POST /products/_search
{
  "query": {
    "multi_match": {
      "query": "wireless mouse",
      "fields": ["product_name", "description"],
      "type": "cross_fields"
    }
  },
  "explain": true
}
说明:

在这里插入图片描述

  • 这个查询会把 product_namedescription 视为一个联合字段,来匹配查询词 wireless mouse
  • 即使 wireless mouse 分布在多个字段中(例如,product_name 包含 wirelessdescription 包含 mouse),cross_fields 会将它们合并为一个整体进行匹配。

6. 返回的结果对比

假设你使用了相同的查询词 wireless mouse,结果的排序可能会有所不同,具体取决于查询使用的类型。

  1. best_fields:选择一个字段(最匹配的字段),然后返回与该字段最匹配的文档。
  2. most_fields:计算多个字段的得分,并返回得分最高的文档。
  3. cross_fields:将多个字段视为一个字段进行匹配,从而查找多个字段中的联合匹配。

7. 总结对比

类型描述适用场景
best_fields在多个字段上查找匹配,只选择相关性最强的字段作为最终匹配结果(默认)。如果只关注单个最相关字段,适用于精确匹配。
most_fields将多个字段的相关性得分累加,最终返回得分最高的结果。如果多个字段的匹配结果对最终排序有较大影响。
cross_fields将多个字段合并为一个整体进行查询,适用于查询词分布在不同字段中的情况。如果多个字段包含查询的不同部分,且它们属于相同的概念。

8. 总结

  • best_fields 适用于你只关心最相关的字段结果时,通常用于精确匹配查询。
  • most_fields 适用于你希望多个字段的匹配都能影响查询结果时,适合宽松匹配。
  • cross_fields 适用于你希望将多个字段视为一个字段的组合时,尤其是在查询词分布在不同字段中时。

http://www.kler.cn/a/450392.html

相关文章:

  • 活着就好20241225
  • Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总
  • 漏洞检测工具:HOST头部攻击
  • GPU环境配置
  • mapbox基础,加载mapbox官方地图
  • C++的侵入式链表
  • 用于管理Unity中UGUI的工具系统UISystem
  • Bootstrap 5 加载效果
  • python学opencv读取图像(十四)BGR图像和HSV图像通道拆分
  • Vision Pro开发实现系统UI风格 毛玻璃效果
  • |-牛式-|
  • WebRTC学习二:WebRTC音视频数据采集
  • ChatGPT与Postman协作完成接口测试(二)
  • 1 SpringBoot——项目搭建
  • Web 第一次作业 初探html 使用VSCode工具开发
  • 后端-redis
  • Git远程仓库的使用
  • 【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
  • 探索数据可视化的利器:Matplotlib
  • 【云原生】kubeadm搭建的kubernetes1.28集群上自建ingress-nginx服务
  • 【Qt】了解和HelloWorld
  • 【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
  • Spring Web MVC:功能端点(Functional Endpoints)
  • Java AOP 介绍与实践
  • amazon广告授权
  • Django 模型管理器中自定义方法和添加导出功能