elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心...
1.最佳字段(Best fields)::
假设我们有一个让用户搜索博客文章的网站(允许多字段搜索,最佳字段查询),就像这两份文档一样:
PUT /my_index/my_type/1
{"title": "Quick brown rabbits","body": "Brown rabbits are commonly seen." } PUT /my_index/my_type/2 { "title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis." }
// SENSE: 110_Multi_Field_Search/15_Best_fields.json
用户输入了"Brown fox",文档2匹配的更好一些,因为它包含了用户寻找的两个单词。
{"multi_match": {"query": "Quick brown fox","type": "best_fields", <1> "fields": [ "title", "body" ], "tie_breaker": 0.3, "minimum_should_match": "30%" <2> } }
2.多数字段(Most fields)::
一个用来调优相关度的常用技术是将相同的数据索引到多个字段中。它用来尽可能多地匹配文档。
考虑一下most_fields查询是如何执行的:ES会为每个字段生成一个match查询,然后将它们包含在一个bool查询中。
我们可以将查询传入到validate-query API中进行查看:
GET /_validate/query?explain
{"query": {"multi_match": {"query": "Poland Street W1V","type": "most_fields", "fields": [ "street", "city", "country", "postcode" ] } } }
// SENSE: 110_Multi_Field_Search/40_Entity_search_problems.json
它会产生下面的解释(explaination):
(street:poland street:street street:w1v)
(city:poland city:street city:w1v)
(country:poland country:street country:w1v)
(postcode:poland postcode:street postcode:w1v)
你可以发现能够在两个字段中匹配poland的文档会比在一个字段中匹配了poland和street的文档的分值要高。
3.跨字段(Cross fields)::
对于一些实体,标识信息会在多个字段中出现,每个字段中只含有一部分信息:
- Person:
first_name
和last_name
- Book:
title
,author
, 和description
- Address:
street
,city
,country
, 和postcode
此时,我们希望在任意字段中找到尽可能多的单词。我们需要在多个字段中进行查询,就好像这些字段是一个字段那样。
用户也许会搜索名为"Peter Smith"的人,或者名为"Poland Street W1V"的地址。每个查询的单词都出现在不同的字段中。
如果你在索引文档前就能够自定义_all字段的话,那么使用_all字段就是一个不错的方法。但是,ES同时也提供了一个搜索期间的解决方案:使用类型为cross_fields的multi_match查询。cross_fields类型采用了一种以词条为中心(Term-centric)的方法,这种方法和best_fields及most_fields采用的以字段为中心(Field-centric)的方法有很大的区别。它将所有的字段视为一个大的字段,然后在任一字段中搜索每个词条。
为了阐述以字段为中心和以词条为中心的查询的区别,看看以字段为中心的most_fields查询的解释(译注:通过validate-query API得到):
GET /_validate/query?explain
{"query": {"multi_match": {"query": "peter smith","type": "most_fields", "operator": "and", <1> "fields": [ "first_name", "last_name" ] } } }
// SENSE: 110_Multi_Field_Search/50_Cross_field.json
<1> operator设为了and,表示所有的词条都需要出现。
对于一份匹配的文档,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类型首先会解析查询字符串来得到一个词条列表,然后在任一字段中搜索每个词条。仅这个区别就能够解决在以字段为中心的查询中提到的3个问题中的2个,只剩下倒排文档频度的不同这一问题。
幸运的是,cross_fields类型也解决了这个问题,从下面的validate-query请求中可以看到:
GET /_validate/query?explain
{"query": {"multi_match": {"query": "peter smith","type": "cross_fields", <1> "operator": "and", "fields": [ "first_name", "last_name" ] } } }
// SENSE: 110_Multi_Field_Search/50_Cross_field.json
<1> cross_fields
使用以词条为中心(Term-centric)进行匹配。
它通过混合(Blending)字段的倒排文档频度来解决词条频度的问题:
+blended("peter", fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])
换言之,它会查找词条smith在first_name和last_name字段中的IDF值,然后使用两者中较小的作为两个字段最终的IDF值。因为smith是一个常见的姓氏,意味着它也会被当做一个常见的名字。
提示:为了让cross_fields查询类型能以最佳的方式工作,所有的字段都需要使用相同的解析器。使用了相同的解析器的字段会被组合在一起形成混合字段(Blended Fields)。
如果你包含了使用不同解析链(Analysis Chain)的字段,它们会以和best_fields相同的方式被添加到查询中。比如,如果我们将title字段添加到之前的查询中(假设它使用了一个不同的解析器),得到的解释如下所示:
(+title:peter +title:smith)
(+blended("peter", fields: [first_name, last_name])+blended("smith", fields: [first_name, last_name])
)
当使用了minimum_should_match以及operator参数时,这一点尤为重要。
摘自:https://es.xiaoleilu.com/110_Multi_Field_Search/50_Cross_field.html
转载于:https://www.cnblogs.com/bonelee/p/6827068.html
elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心...相关推荐
- Elastic认证特训营 难点解读01——best_fields, most_fields, cross_fields 拆解认知
1.Multi-match query 的目的 多字段匹配 2.best_fields 为默认值,如果不指定,默认best_fields匹配. 含义:多个字段中,返回评分最高的. 类似:dis_max ...
- Elasticsearch实战(八)--- 词条为中心的 CrossFields 多字段搜索策略
Elasticsearch实战- 词条为中心的Cross Fields 搜索策略 文章目录 Elasticsearch实战- 词条为中心的Cross Fields 搜索策略 1.字段中心实现方式及问题 ...
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- 彻底扒光 通过智能路由器拆解看其本质
可以看到很多联发科的MT芯片 摘自:https://net.zol.com.cn/531/5312999.html 彻底扒光 通过智能路由器拆解看其本质 2015-07-23 00:40:00 [ ...
- 产品新人必看:入职前的准备及快速适应产品工作
我第一次做分享,没有什么经验,不知道能不能讲好. 我先自我介绍一下,我是从UED转产品的,我现在这家公司已经快干了一年了,我是去年的5月份入职的. 求职期间陪学也帮了我很多忙,我基本上是全天有什么问 ...
- 看清本质:程序员为什么会写Bug?
最近在思考研发团队质量的问题,我觉得这是个很有意思的问题,直觉上来看,bug 是程序员挖的坑,但从团队的角度来看,却不尽然,接下来我们做一个深入的剖析. 个人问题 程序员的个人能力和经验会有所差异,从 ...
- 好心情平台:看精神科医生前必知的5件事!让你少花钱少受罪
去医院就诊前,想必很多朋友会有诸多疑问: ● 是去专科医院好,还是去综合医院比较好? ● 去医院就诊时要不要找人陪同? ● 都需要准备些什么? ● 怎么在有限的时间里跟医生高效沟通? .... ...
- 傲游“马上看”VS视频网站前贴片:谁动了谁的奶酪
视频行业整体仍处于亏损边缘,在天价版权和盈利压力的面前,很多视频网站采用了加长贴片广告时长的方式来提高收入,以缓解收支矛盾.殊不知,这样却破坏了用户体验,同时,广告效果也完全无法达到------遇到长 ...
- 小白一看就懂的前后端接口连接
作为刚入职的小白,总是听前辈们说"连接口很简单的 ,一看就懂",由于鄙人实在是才疏学浅,实在是绕的头晕眼花,不知道怎么肥事.于是耐心用一下午仔细研究每一句代码,研究他们之间的联系, ...
最新文章
- python爬虫有什么用处-python为什么叫爬虫 python有什么优势
- Java中Set巧用,去掉重复数据
- asp.net开发 网络硬盘[转贴+删节]
- Exceptionless 本地部署
- cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】轮廓面积与长度
- python如何和qt交互_Python 之Pyqt5操作交互处理,原来这么简单!
- 速度极大提升,Arch Linux 计划将 zstd 作为默认压缩算法
- Android技巧:003使用Intent连接多个活动
- [ios] 申请账号,发布应用
- linux文件属性详解及文件类型
- android实时声音信号波形_android绘制播放音频的波形图
- 66个求职应聘技巧性问答(三)
- redux 的入门级别使用 讲解
- 依米花播放器仿绚丽彩虹播放器程序
- [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no enc
- 【LoadBalancer】SpringCloud微服务组件LoadBalancer
- 教你实现微信公众号效果:长按图片保存到相册
- 文件删除终结者 v1.2 免费
- 普歌+阿里云视频点播错误修改
- window下配置qemu虚拟机联网
热门文章
- 十四、H.264的变换编码(一)——矩阵运算与正交变换基本概念
- c语言中和if语句作用相似的运算符,南开18秋学期(1709、1803、1809)《C语言程序设计》在线作业【答案】...
- python 关联表_python学习------9.13----约束、表之间的关联关系
- 一棵树的生成树有几颗_次小生成树(树剖,生成树)
- MYSQL批量插入数据库实现语句性能分析
- nginx的error.log日志常见的几个错误解决方法
- 【机器学习】基于概率论的分类方法和Logistic回归
- 【深度学习】Tensorflow搭建卷积神经网络实现情绪识别
- python【数据结构与算法】循环赛日程表(分治)
- 【Web安全】漏洞之王-Sql注入原理与危害解析