搜索框多字段查询_ElasticSearch系列-搜索-Multi Match-cross_fields 区别

跨字段查询 之 字段中心式(field-centric)词中心式(term-centric)的区别

字段中心式

字段中心式的 most_fields 查询的 explanation 解释:

GET /_validate/query?explain{    "query": {        "multi_match": {            "query":       "peter smith",            "type":        "most_fields",            "operator":    "and",             "fields":      [ "first_name", "last_name" ]        }    }}

所有词都是必须的

对于匹配的文档, peter 和 smith 都必须同时出现在相同字段中,要么是 first_name 字段,要么 last_name 字段

(+first_name:peter +first_name:smith) (+last_name:peter +last_name:smith)

词中心式 会使用以下逻辑:

+(first_name:peter last_name:peter) +(first_name:smith last_name:smith)

换句话说,词 peter 和 smith 都必须出现,但是可以出现在任意字段中


词中心式

cross_fields 类型首先分析查询字符串并生成一个词列表,然后它从所有字段中依次搜索每个词。这种不同的搜索方式很自然的解决了 字段中心式 查询三个问题中的二个。剩下的问题是逆向文档频率不同。

幸运的是 cross_fields 类型也能解决这个问题,通过 validate-query 可以看到:

GET /_validate/query?explain{    "query": {        "multi_match": {            "query":       "peter smith",            "type":        "cross_fields",             "operator":    "and",            "fields":      [ "first_name", "last_name" ]        }    }}

用 cross_fields 词中心式匹配

它通过 混合 不同字段逆向索引文档频率的方式解决了词频的问题:

+blended("peter", fields: [first_name, last_name])

+blended("smith", fields: [first_name, last_name])

换句话说,它会同时在 first_name 和 last_name 两个字段中查找 smith 的 IDF ,然后用两者的最小值作为两个字段的 IDF 。结果实际上就是 smith 会被认为既是个平常的姓,也是平常的名。

按字段提高权重

采用 cross_fields 查询与 自定义 _all 字段 相比,其中一个优势就是它可以在搜索时为单个字段提升权重。

这对像 first_name 和 last_name 具有相同值的字段并不是必须的,但如果要用 title 和 description字段搜索图书,可能希望为 title 分配更多的权重,这同样可以使用前面介绍过的 ^ 符号语法来实现:

GET /books/_search{    "query": {        "multi_match": {            "query":       "peter smith",            "type":        "cross_fields",            "fields":      [ "title^2", "description" ]         }    }}

title 字段的权重提升值为 2 , description 字段的权重提升值默认为 1

自定义单字段查询是否能够优于多字段查询,取决于在多字段查询与单字段自定义 _all 之间代价的权衡,即哪种解决方案会带来更大的性能优化就选择哪一种

b8f2f2802406af52f0d4ed77600a1ab0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值