一、复合查询

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相比,它还可以在搜索时为单个字段提升权重,如下图所示:

精彩文章来源微信公众号 java微技术

子查询返回多个字段_ElasticSearch搜索之QueryFiltering、多/单字符串的多字段查询...相关推荐

  1. sql嵌套查询返回多个字段_list4 SQL复杂查询

    子查询返回结果形式不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集有一行多列) 表子查询(结果集一般为多行多列) 子查询在主查询中出现的位置不同: selec ...

  2. oracle单行子查询返回多个行 order by,单行子查询返回多个行

    子查询: 用子查询能解决的问题 假想你想要写一个查询来找出挣钱比陆涛的薪水还多的人.为了解决这个问题,你需要两个查询:一 个找出陆涛的收入,第二个查询找出收入高于陆涛的人. 你可以用组合两个查询的方法 ...

  3. mysql子查询语句多列_MYSQL 子查询返回多列显示

    因工作需要,目前研究出一种mysql 技能,与大家分享一下. 需求:关联查询另一个大表数据的某些(一个以上)字段 方案:因关联查询的表数据太大.多表查询影响效率,单个子查询又有些多余.所以采用多列拼接 ...

  4. 单行子查询返回多个行_sql多表查询练习,习题总结

    组函数(聚合函数):组函数操作行集,给出每组的结果.组函数不象单行函数,组函数对行的集合进行操作,对每组给出一个结果.这些集合可能是整个表或者是表分成的组. 组函数和单行函数的区别: 单行函数对查询到 ...

  5. oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助

    with order_base as --获取订单基础情况 ( select ou.order_key order_key, ou.order_quantity_i, ood.dispatch_tim ...

  6. ORA-01427: 单行子查询返回多个行 出现原因及对应防止措施

    今天的一段批量更新的sql语句,稍微修改了一下就报错:ORA-01427: 单行子查询返回多个行.这个问题其实之前有遇到过几次,原因也比较简单,就是没有做好子查询的约束条件,导致该返回一条数据的地方返 ...

  7. mysql子查询返回多于1行_mysql – 子查询返回超过1行

    我有以下查询 SELECT Group_concat(employeename) AS name FROM employee WHERE Find_in_set(Find_in_set(employe ...

  8. 思迅软件PDA 3900 BUG 代码:05FF 子查询返回的值不止一个。当子查询跟随在 之后,或子查询用作表达式时

    主程序:思迅商锐9.5 PDA 3900 服务端版本 1.1 事件类型:PDA查询报表 查询商品档案时 返回上图错误 代码:05FF 子查询返回的值不止一个.当子查询跟随在 =.!=.<.< ...

  9. php去掉查询返回的字段序列号,php – 为返回的MySQL查询添加编号列表列

    我试图用我的SQL查询返回一个序列号列.我需要将它放在SELECT语句中,因为我想将此查询嵌套在另一个中,然后使用之前生成的列进行进一步的计算. 我到处寻找,我找不到任何这方面的例子. 以下内容的效果 ...

最新文章

  1. 解决Win10下_findnext()异常
  2. 电脑svchost进程占用内存
  3. Java内部类与静态内部类
  4. 虚拟机VMware 14安装教程
  5. 深圳职业技术学院计算机工程学院江学锋,毕业论文附属材料07013505刘丽.doc
  6. 关于java中锁的面试题_Java面试题-Java中的锁
  7. java继承调用先后_「继承顺序」JAVA继承顺序 - seo实验室
  8. 再谈C#里4个访问权限修饰符
  9. Android学习之-TextView的滑动效果
  10. UGUI 在面板经常使用的表格布局制作
  11. (转) 三袋米的故事
  12. 最新AWVS14安装使用教程(2021年10月11日)
  13. java贪吃蛇项目总结_贪吃蛇总结
  14. 金盘系统无法连接服务器,西数金盘Gold系列主要面向企业级服务器及存储系统...
  15. java实现多模匹配算法_多模字符串匹配算法-Aho–Corasick
  16. STM32CubeMX和STM32CubeIDE组合,定义STM32开发新方式
  17. 如何识别企业内的“千里马”?
  18. rfid连接mysql_如何实现 RFID 数据与数据库连接?
  19. 机器视觉和计算机视觉理解
  20. 一台服务器最大能支持多少条TCP连接

热门文章

  1. Lodash-一个一致性、模块化、高性能的 JavaScript 实用工具库介绍
  2. Tensorflow 入门手册(代码与原理释义)
  3. IoU,ROI 和 ROC,AUC区分
  4. 南京财经大学计算机专业读研,计算机考研报录比比较的院校:南京财经大学
  5. 转 基于ssm的Bootstrap-table的学习演示
  6. Linux 权限管理之基本权限
  7. git入门与实践【转】
  8. PHP高效获取远程图片尺寸和大小(转)
  9. 时间O(n)/空间O(1)实现长n字符串前m个移到末尾
  10. 记ByteCTF中的Node题