一、复合查询

  1、在ElasticSearch中,有Query和Filter两种不同的Context。Query Context进行了相关性算分,Filter Context不需要进行算分,同时可以利用Cache,获取更好的性能。

  2、bool Query:一个布尔查询,是一个或者多个查询子句的组合,总共有四种类型的子句,其中2种影响算分,2种不影响算分。

   布尔查询也涉及相关性算分,因为匹配的子句越多,相关性算分越高。对于布尔查询中的每个查询子句计算得出的算分会被合并到总的相关性算分中。

   子查询可以任意顺序出现,同时可以嵌套多个子查询。

   

   布尔查询的算分过程:

    1)查询Should语句中的查询;

    2)对查询结果的评分进行求和;

    3)乘以匹配语句的总数;

    4)除以所有语句的总数;

  3、复合查询应用

    1)must_not与filter

  

    2)should

  

    3)bool嵌套

  

    4)对于should下同一层级的竞争字段,具有相同的权重,若通过嵌套bool查询,可以改变对算分的影响。

  

    5)控制字段boost权重,来影响查询返回的结果。

  

  

    6)要求满足相关度高的文档在前或者排除不相关条件的文档,Boosting Query提升了Precision,同时也提升了Recall。

  

  

 二、单字符串多字段查询

  1)背景示例展示:

  

  从示例中可以看出,对title和body两个字段进行“brown fox”的匹配,由于第二条只有在body中有brown fox,而第一条在title,body中均有匹配。所以,第一条的综合算分比第二条的算分要高。

  2)Disjunction Max Query

  对于上例中title与body相互竞争,在查询brown fox时,更应该将第二条信息搜索出来。因此,对于搜索策略不应该将分数简单相加,而是应该找到最佳匹配的字段评分。

  Disjunction Max Query可以按最匹配字段评分进行返回。

  

  从上图可以看出,通过Disjunction Max Query进行查询,获取了最合适的匹配结果。

  3)Tie Breaker

  

  通过对quice pets进行查询,会发现两条文档的评分是一样的,这是因为quick pets做为查询Term存在,在title或body中存在,两者的评分是一样的。为了获取最佳匹配,可以使用Tie Breaker。如下图所示:

  

  可以看出,文档2排在了文档1的前面,原因是文档2的title和body,分别存有quick或pets,而文档1中只有title存在有一个quick。因此文档2的评分比文档1的高。

  Tie Breaker的作用:Tie Breaker是一个介于0-1之间的浮点数,1代表使用最佳匹配;0代表所有语句同等重要。

    获得最佳匹配语句的评分;

    将其他匹配语句的评分与Tie Breaker相乘;

    对以上评分求和并规范化;

  4)Multi Match

  当输入单个字符串进行查询时,通常会遇到三种情形:

    a)最佳字段

    当字段之间相互竞争,又相互关联时,评分来自于最匹配字段,比如上述的title和body字段。如当搜索“brown fox”时,此时该词组比两个独立的单词更有意义,因此文档在相同字段中包含的词最多越好,评分也来自于最匹配字段。

    

    b)多数字段

    为了对相关度进行微调,常用的技术就是将相同的数据索引到不同的字段,以匹配更多的文档。具体操作就是:

      在主字段抽取词干,加入同义词、变音词、口语词,以匹配更多的字段;

      相同的文本,加入子字段,以提供更加精确的匹配;

      其他字段作为匹配文档提高相关度的信号,匹配字段最多越好;

    

    通过上图可以发现,文档2更符合quicking brown的搜索条件,但是它排在了第2位,原因就是两个字段采用了英文分词器,而查询的实际上是quick、brown两个Term,在两个文档中的title或body字段中,存在于这两个词。又因为第一个文档的相应字段总词数比第二个文档的相应字段总词数少,所以文档1评分会较高。

    

    对上图分析发现,用广度匹配字段body,以包括尽可能多的文档,提升了召回率,同时对body字段增加了子字段,将std作为信号将相关度更高的文档置于结果顶部。

    每个字段对于最终评分的贡献可以通过自定义值boost来控制。如下图所示:

    未设置boost值的情况

    

    将body设置boost的情况

    

    c)混合字段

    对于某些实休,例如人名、地址、图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在列出的字段中找到尽可能多的词。

      比如对于街道+门牌号存在于指定搜索字段的文档记录,如果想用most_fileds进行搜索是无法直接进行搜索的,对于operator=and也不能使用,因为它不适用于跨字段场景中。

    而之前用于字段中的copy_to,虽然可以解决此类问题,但是需要额外的存储空间,因此也不是最优的解决方式。

    

    从上图中可以看出,cross_fields可以配合operator=and进行跨字段的查询匹配,同时与copy_to相比,它还可以在搜索时为单个字段提升权重,如下图所示:

    

    

  大家可关注我的公众号

   

  知识学习来源:阮一鸣:《Elasticsearch核心技术与实战》

ElasticStack学习(十):深入ElasticSearch搜索之QueryFiltering、多/单字符串的多字段查询的更多相关文章

  1. vue学习(十四) 条件搜索框动态查询表中数据 数组的新方法

    //html <div id="app"> <label> 名称搜索关键字: <input type="text" clasa=& ...

  2. [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优

    最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...

  3. [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优(转)

    最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...

  4. [Elasticsearch2.x] 多字段搜索 (二) - 最佳字段查询及其调优 <译>

    最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/ { "title": "Q ...

  5. ElasticStack学习(六):ElasticSearch搜索初探

    一.ElasticSearch搜索介绍 1.ElasticSearch搜索方式主要分为以下两种: 1).URI Search:此种查询主要是使用Http的Get方法,在URL中使用查询参数进行查询: ...

  6. ElasticStack学习(七):ElasticSearch之Mapping初探

    一.Mapping的概念 1.Mapping类似于数据库中的Schema的定义,作用如下: 1)定义索引中的字段的名称: 2)定义字段的数据类型,例如字符串.数字.日期.布尔等: 3)对每个字段进行倒 ...

  7. 【Elasticsearch学习】文档搜索全过程

    在ES执行分布式搜索时,分布式搜索操作需要分散到所有相关分片,若一个索引有3个主分片,每个主分片有一个副本分片,那么搜索请求会在这6个分片中随机选择3个分片,这3个分片有可能是主分片也可能是副本分片, ...

  8. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  9. 强化学习(十九) AlphaGo Zero强化学习原理

    在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...

随机推荐

  1. UWP入门(三) -- StackPanel与Grid的区别

    原文:UWP入门(三) -- StackPanel与Grid的区别 ##1.Grid 下布局 <Grid Background="{ThemeResource ApplicationP ...

  2. 为什么360、百度、腾讯出的Mac端云盘客户端都只有同步盘?(用户量小,同步盘开发成本低,Linux下都没有客户端)

    如题,顾名思义,同步盘是用来同步的,不具备增量的功能,像这三家在Windows端出的客户端都是即有同步也有增量的. 陆续出来的,可能大家更多的是跟随策略,不得不提dropbox是这样的形式.mac电脑 ...

  3. 毕设(一)C#的百度api调用

    这个学期就要毕业了,选了一个无人机地面站软件设计的题目,这几天也开始着手做, 首先做了一个百度地图的调用,这里因为是上位机的开发,所有就不介绍Javascript的 调用方法,核心是用到一个类Http ...

  4. 多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)

    [自序]虑而後能得(自序)故事接触 C++ 大约是 1989 年的事.那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了.横扫千军的 Windows 3.0 还没有诞生,如今以 C+ ...

  5. Qt之Model-View架构(雨田哥的博客)

    Qt之Model-View架构 Qt之Model-View架构 简述 效果图 代码 结尾 简述 为什么会用这个模式,这里我就不解释了,可以看下 豆子哥的见解 .这里我只是如何去使用的.供大家共同探讨学 ...

  6. javaweb各种框架组合案例(二):maven+spring+springMVC+mybatis

    1.mybatis是比较新的半自动orm框架,效率也比较高,优点是sql语句的定制,管理与维护,包括优化,缺点是对开发人员的sql功底要求较高,如果比较复杂的查询,表与表之间的关系映射到对象与对象之间 ...

  7. Python时间戳的一些使用

    Python时间戳的一些使用 为什么写下这篇文档? 由于我本身是做Python爬虫的,在爬取网站的过程当中,会遇到形形色色的验证码,目前对于自己而言,可能简单的验证码可以进行自己识别 发现大多数的网站 ...

  8. HBase 学习之路(四)—— HBase集群环境配置

    一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...

  9. 寻找图的强连通分量:tarjan算法简单理解

    1.简介tarjan是一种使用深度优先遍历(DFS)来寻找有向图强连通分量的一种算法. 2.知识准备栈.有向图.强连通分量.DFS. 3.快速理解tarjan算法的运行机制提到DFS,能想到的是通过栈 ...

  10. 我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

    GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的 ...