Bool Query - 布尔组合查询

把其它查询布尔组合在一起。

使用 must、should、must_not、filter 选项表示其它查询之间的布尔关系。每个选项都可以出现任意次。

从结构上,布尔组合查询支持水平嵌套(各平级从句之间是and逻辑关系)、垂直嵌套。

  • must:查询从句必须用于匹配文档,相当于逻辑运算的 and。查询从句参与评分。must 从句的查询条件必须全部满足。

  • filter:查询从句必须用于匹配文档,相当于逻辑运算的 and。查询从句不参与评分。filter 从句的查询条件必须全部满足。

  • should:查询从句可以用于匹配文档,也可以不匹配,相当于逻辑运算的 or。查询从句参与评分。should 从句的查询条件满足的数量由 minimum_should_match 参数控制。

  • must_not:查询从句不能用来匹配文档。查询语句不参与评分。must_not 从句的查询条件必须全部不满足。

  • minimum_should_match:需要至少匹配指定数量个 should 从句。如果布尔组合查询只包含一个 should 从句,也就是说没有 must、filter、must_not 从句,那么该参数默认为 1。否则该参数默认为 0。

    • 正整数值:比如 3。表示至少需要匹配 3 个 should 从句。

    • 负整数值:比如 -2。表示至少需要匹配 should 从句的总数量 - 2 个 should 从句。

    • 正比例值:比如 75%。表示至少需要匹配 (should 从句的总数量 * 75%,再向下取整) 个 should 从句。

    • 负比例值:比如 -25%。表示至少需要匹配 should 从句的总数量 - (should 从句的总数量 * 25%,再向下取整)个 should 从句。

    • 组合值:比如 3<90%。表示如果 should 从句的数量为 1-3 之间,需要全部匹配;如果 should 从句的数量 > 3,需要匹配 90% 个 should 从句。

    • 多个组合值:比如 2<-25% 9<-3。表示如果 should 从句的数量为 1-2 之间,需要完全匹配;如果 should 从句的数量为 3-9 之间,需要匹配 -25% 个 should 从句;如果 should 从句数量 > 9,需要匹配 -3 个 should 从句。

e.g. (must、filter 从句例子)查询"OriginWeather"是"Sunny"并且"DestWeather"是"Rain"的文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"must": [{"match": {"OriginWeather": "Sunny"}},{"match": {"DestWeather": "Rain"}}]}}
}
GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"filter": [{"match": {"OriginWeather": "Sunny"}},{"match": {"DestWeather": "Rain"}}]}}
}

filter从句查询得到的 max_score 以及每个匹配文档的 _score 都是0.0。

e.g. (must_not 从句例子)查询"OriginWeather"不是"Sunny"的并且"DestWeather"不是"Rain"的所有文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"must_not": [{"match": {"OriginWeather": "Sunny"}},{"match": {"DestWeather": "Rain"}}]}}
}

must_not从句查询得到的 max_score 以及每个匹配文档的 _score 都是0.0。

e.g. (should 从句例子)查询"OriginWeather"是"Sunny"的或者"DestWeather"是"Rain"的文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"should": [{"match": {"OriginWeather": "Sunny"}},{"match": {"DestWeather": "Rain"}}]}}
}

e.g. (should从句例子)由 minimum_should_match 参数控制 should 从句满足的数量

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"should": [{"match": {"OriginWeather": "Sunny"}},{"match": {"DestWeather": "Rain"}},{"match": {"DestCountry": "AU"}}],"minimum_should_match": "2<50% 5<-20%","boost": 2}}
}

e.g. (水平嵌套例子)查询"DestWeather"是"Rain"的,“OriginWeather” 可能是"Sunny" 的文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"should": [{"match": {"OriginWeather": "Sunny"}}],"must": [{"match": {"DestWeather": "Rain"}}]}}
}

e.g. (垂直嵌套例子)查询"OriginWeather"是"Sunny" 的或者(“DestWeather"是"Rain"并且"DestCountry” 是"AU" )的文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"bool": {"should": [{"match": {"OriginWeather": "Sunny"}},{"bool": {"must": [{"match": {"DestWeather": "Rain"}},{"match": {"DestCountry": "AU"}}]}}]}}
}

Boosting Query - 加权组合查询

给部分字段的分值增加权重,以此来影响分词领域的查询排序。可以正向加权(增加权重),也可以反向加权(降低权重)。

  • negative_boost:0 ~ 1.0 之间的浮点数,用来减少匹配 negative 查询的关联性分数;如果大于1.0,用来增加匹配 negative 查询的关联性分数。

如果一个文档同时匹配 positive 查询和 negative 查询,最终的关联性分数计算如下:

  • 获取 positive 查询的关联性分数。
  • 再乘以 negative_boost 的值。

e.g. 查询"OriginWeather"是"Sunny"的文档,如果还匹配"DestCountry"是"AU"的,会降低整体的关联性分数

GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"query": {"boosting": {"positive": {"match": {"OriginWeather": "Sunny"}},"negative": {"match": {"DestCountry": "AU"}},"negative_boost": 0.5}
}
}

Constant_Score Query - 固定分值查询

依赖filter查询,对每个匹配的文档指定固定的关联性分数。

  • filter:查询条件用于匹配文档。filter查询不参与评分。为了提高性能,Elasticsearch会自动缓存经常使用的filter查询。
  • boost:默认1.0。为每个匹配的文档指定的关联性分数。

应用领域

多条件组合查询中,部分字段仅用来作为过滤条件查询,不干预分值计算,从而影响排序。

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"constant_score": {"filter": {"match": {"OriginWeather": "Sunny"}},"boost": 1.2}}
}

Dis_Max Query - 分离最大化查询

非官方叫法:分离最大化查询、最佳字段匹配查询、最大分值提取查询

如果一个文档匹配多个查询语句,dis_max查询会获取分值最高的查询语句的评分 + 其它匹配的查询语句的评分 * tie_breaker 作为最终的关联性分数。

  • queries:包含一个或者多个查询语句。文档必须匹配一个或者多个这些查询语句。

  • tie_breaker:(可选参数)介于0到1之间的浮点数。默认0.0。用于增加其它匹配语句的关联性分数。

e.g. 获取"DestCountry"是"GB"的(权重乘2)、"OriginCuntry"是"AE"的两个查询条件中匹配度最高的文档

GET kibana_sample_data_flights/_search
{"track_total_hits": true,"query": {"dis_max": {"tie_breaker": 1.0,"boost": 1,"queries": [{"term": {"DestCountry": {"value": "GB","boost": 2}}},{"term": {"OriginCountry": "AE"}}]}}
}

Function_Score Query - 函数组合查询

基于其它查询条件筛选后的结果做二次查询。

  • query:主查询(必须)
GET kibana_sample_data_flights_compound/_search
{"query": {"function_score": {"query": {"term": {"DestCountry.keyword": {"value": "GB"}}}}}
}
  • score_mode: 函数之间的评分模式。

    • multiply:相乘(默认)
    • sum:相加
    • avg:取平均值
    • first:取第一个命中的filter的得分
    • max:取最大值
    • min:取最小值
  • boost_mode:函数与主查询之间的评分模式。

    • multiply:相乘(默认)
    • replace:functions语句的得分替换主查询的得分
    • sum:相加
    • avg:取平均值
    • max:取最大值
    • min:取最小值

评分类型:weight权重评分、script_score脚本评分、random_score随机评分、field_value_factor字段值因子评分、decay functions衰减函数评分

weight:权重评分

对于命中的filter,使用权重值作为其评分

GET kibana_sample_data_flights_compound/_search
{"track_total_hits": true,"query": {"function_score": {"query": {"constant_score": {"filter": {"term": {"DestCountry.keyword": "GB"}},"boost": 1.0}},"functions": [{"filter": {"match": {"OriginWeather": "Rain"}},"weight": 3},{"filter": {"match": {"DestWeather": "Cloudy"}},"weight": 2}],"score_mode": "min","boost_mode": "sum"}}
}

script_score:脚本评分

GET kibana_sample_data_flights_compound/_search
{"query": {"function_score": {"query": {"term": {"DestCountry.keyword": {"value": "GB"}}},"script_score": {"script": "doc['FlightDelayMin'].value"},"boost_mode": "replace"}}
}

random_score:随机评分

生成0到1(不包括1)的均匀分布的分数。默认使用内部的Lucene的doc id作为随机源,效率很高但是文档可能因为合并而重新编号导致不能重现上一个随机数,除非提供 seed 和 field。如果提供的话,最终得分的计算基于seed、文档中指定field的最小值以及基于索引名和分片id的盐从而使不同文档得到相同的分数。也就是说在相同分片的并且field的值相同的不同文档会得到相同的评分。可以考虑在不同文档中使用一个具有唯一值的field,一个比较好并且默认的选择是使用_seq_no ,但是唯一的缺点就是一旦更新文档就会更新它,从而更新分数。

GET kibana_sample_data_flights_compound/_search
{"query": {"function_score": {"query": {"term": {"DestCountry.keyword": {"value": "GB"}}},"random_score": {"seed": 314159265359,"field": "_seq_no"},"boost_mode": "multiply"}}
}

如果不指定random_score中的field也是可以的,但是不推荐,这种方式会要求加载 _id字段的数据,会消耗大量内存。

field_value_factor:字段值因子评分

使用文档中的一个字段来参与评分。有点像script_score脚本评分,但是它避免了脚本的开销。如果用在一个多值的字段上,只有字段的第一个值参与评分。这种方式得到的评分一定是非负的,否则会报错。

  • field:文档中的指定字段。
  • modifier:字段值的修饰符。默认none。支持none、log、log1p、log2p、ln、ln1p、ln2p、square、sqrt、reciprocal。
  • factor:字段值因子。用来乘以字段值。默认1。
  • missing:字段的缺省值。如果文档没有指定的字段,提供一个默认值,然后使用modifier、factor参数计算分值。
# FlightTimeMin*FlightTimeMin*1.2
GET kibana_sample_data_flights_compound/_search
{"query": {"function_score": {"query": {"term": {"DestCountry.keyword": {"value": "GB"}}},"field_value_factor": {"field": "FlightTimeMin","factor": 1.2,"modifier": "square","missing": 1}, "boost_mode": "multiply"}}
}

decay functions衰减函数评分

// todo

Elasticsearch使用篇 - 组合查询相关推荐

  1. Elasticsearch 中 bool组合查询(must 和 should 组合)

    需求 查询考试成绩是60分或90分的女生. 所以查询条件应该这么写 sex == '女' && ( score == 60 || score ==90 ); 先看下bool的语法 {& ...

  2. Elasticsearch 4: 相关性检索和组合查询

    目录 1. 相关性评分 2. 相关度模型 2.1 布尔模型 2.2 向量空间模型 2.3 概率模型 2.4 语言模型 3. TF/IDF 4. BM25 4.1 词频饱和度 4.2 长度归一化 5. ...

  3. ElasticSearch 组合查询(must not_must should filter)

    ElasticSearch 组合查询(must not_must should filter) ElasticSearch Demo: package org.ssgroup;import java. ...

  4. elasticsearch 建立索引、增删改查 及简单查询和组合查询的学习笔记

    创建一个索引(数据库) PUT lagou # 索引名称 {"settings": {"index":{"number_of_shards" ...

  5. ElasticSearch实现高亮、范围查询和多条件组合查询(java和kibana)

    ElasticSearch客户端配置参考之前的博客 1.高亮 高亮的本质其实是将搜索结果中需要高亮的字段进行替换 public List<Map<String,Object>> ...

  6. Elasticsearch搜索引擎第十一篇-Suggest查询建议

    文章目录 查询建议是什么 ES查询建议API Suggester介绍 term suggester phrase suggester completion suggester 自动补全 查询建议是什么 ...

  7. 跟乐乐学ES!(三)ElasticSearch 批量操作与高级查询

    上一篇文章:跟乐乐学ES!(二)ElasticSearch基础. 下一篇文章:跟乐乐学ES!(四) java中ElasticSearch客户端的使用. 批量操作 有些增删改查操作是可以进行批量操作的, ...

  8. Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    前言 本来该篇教程就应该写到 Springboot 整合 ElasticSearch 入门教学必看 https://blog.csdn.net/qq_35387940/article/details/ ...

  9. ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)

    ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2) 1. 前提 2. 轻量搜索 2.1 单条件查询 2.2 多条件查询 2.3 不指定属性查询(查询所有文档属性)-- ...

最新文章

  1. Unicode® Character Name Index
  2. [Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
  3. SharePoint Pages(1)之SharePoint页面体系架构
  4. 马斯克发推:8月特斯拉Autopilot实现完全自动驾驶
  5. python课堂点名_Python制作课堂点名器,原来还能这么玩!
  6. python、matlab、c++的括号增加次序,以及图片存储方式
  7. [2017-AspNet-MVC4] 案例演化:加法测试-1
  8. FileLocker
  9. Android实现百度地图定位服务
  10. 发光二极管pcb封装图画法_贴片发光二极管正负极判断方法
  11. MTK6589反向修改拼包法操作流程
  12. 第3.3节 通过GPIB控制矢量网络分析仪
  13. NR/5G - 一种TDD+FDD场景下Type I codebook size分析
  14. https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot
  15. PHP AES加密解密
  16. 虚拟机启动时,提示找不到ISO映像文件
  17. 苹果电脑如何打印文件
  18. 对Rapidly-exploring Random Trees(RRT)路径规划方法的理解
  19. matlab中bwmorph函数的作用,Matlab中的bwmorph函数解释
  20. 一步一步学ROP之linux_x86篇

热门文章

  1. Linux系统system call的源码以及init/main.c分析
  2. LoRa-SX1276/77/78芯片datasheet
  3. 亚马逊跟卖有效找listing,适合各阶段卖家
  4. 【数学知识】欧几里得空间
  5. 集成JIRA/TAPD管理缺陷,增强接口测试,MeterSphere开源持续测试平台v1.2.0发布丨Release Notes
  6. Android 获取imei号码,获取手机型号和系统版本号
  7. 进程创建、进程等待、进程休眠、结束子进程;macOS查看头文件路径;
  8. Java实现创建word文档模板,根据模板导出word文档
  9. 如何从零开始学习自动化
  10. freesurfer并行处理体会