014-elasticsearch5.4.3【五】-搜索API【三】复合查询boolQuery、constantScoreQuery、disMaxQuery
一、概述
复合查询包装其他复合或叶子查询,以组合其结果和分数,更改其行为,或从查询切换到筛选器上下文。
1.1、constantScoreQuery
包含另一个查询但在过滤器上下文中执行的查询。所有匹配的文档都给出相同的“常量”_score。
1.2、boolQuery【最常用】
用于组合多个叶子或复合查询子句的默认查询,包含must
, should
, must_not
, or filter
。must和should子句将它们的分数组合在一起 - 匹配子句越多越好 - 而must_not和filter子句在过滤器上下文中执行。
must:返回的文档必须满足must子句的条件,并且参与计算分值
filter:返回的文档必须满足filter子句的条件。不参与计算分值
must_not:返回的文档必须不满足must_not定义的条件。不参与评分。
should:返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match
参数定义了至少满足几个子句。
shold理解【匹配的相关度】
{ "query": { "bool": { "must": { "match": { "title": "quick" }}, "must_not": { "match": { "title": "lazy" }}, "should": [ { "match": { "title": "brown" }}, { "match": { "title": "dog" }} ] } } }
以上的查询结果返回 title
字段包含词项 quick
但不包含 lazy
的任意文档。目前为止,这与 bool
过滤器的工作方式非常相似。
区别就在于两个 should
语句,也就是说:一个文档不必包含 brown
或 dog
这两个词项,但如果一旦包含,我们就认为它们 更相关 :
{ "hits": [ { "_id": "3", "_score": 0.70134366, "_source": { "title": "The quick brown fox jumps over the quick dog" } }, { "_id": "1", "_score": 0.3312608, "_source": { "title": "The quick brown fox" } } ] }
文档 3 会比文档 1 有更高评分是因为它同时包含 brown
和 dog
。
注1:评分计算
bool
查询会为每个文档计算相关度评分 _score
, 再将所有匹配的 must
和 should
语句的分数 _score
求和,最后除以 must
和 should
语句的总数。
must_not
语句不会影响评分; 它的作用只是将不相关的文档排除。
注2:控制精度
所有 must
语句必须匹配,所有 must_not
语句都必须不匹配,但有多少 should
语句应该匹配呢? 默认情况下,没有 should
语句是必须匹配的,只有一个例外:那就是当没有 must
语句的时候,至少有一个 should
语句必须匹配。
就像我们能控制 match
查询的精度 一样,我们可以通过 minimum_should_match
参数控制需要匹配的 should
语句的数量, 它既可以是一个绝对的数字,又可以是个百分比:
1.3、disMaxQuery
一个接受多个查询的查询,并返回与任何查询子句匹配的任何文档。虽然bool查询组合了所有匹配查询的分数,但dis_max查询使用单个最佳匹配查询子句的分数。
一个查询,它生成由其子查询生成的文档的并集,并为每个文档评分由任何子查询生成的该文档的最大分数,以及任何其他匹配子查询的平局增量。
当在具有不同增强因子的多个字段中搜索单词时,这非常有用(因此不能将字段等效地组合到单个搜索字段中)。我们希望主要分数是与最高提升相关联的分数,而不是字段分数的总和(如布尔查询所给出的)。如果查询是“albino elephant”,则这确保匹配一个字段的“albino”和匹配另一个的“elephant”获得比匹配两个字段的“albino”更高的分数。要获得此结果,请同时使用Boolean Query和DisjunctionMax Query:对于每个术语,DisjunctionMaxQuery在每个字段中搜索它,而将这些DisjunctionMaxQuery的集合组合成BooleanQuery。
1.4、functionScoreQuery
更多详情:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/query-dsl-function-score-query.html
1.5、boostingQuery
提升查询可用于有效降级与给定查询匹配的结果。与bool查询中的“NOT”子句不同,这仍然会选择包含不良术语的文档,但会降低其总分。
1.6、indicesQuery【5.0.0废弃了】
相关文章
- 了解下 Kuberentes Gateway API
- API和Web Api
- AI与搜索的双螺旋:取之于搜索,用之于搜索
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
- 【数据挖掘】数据挖掘算法 组件化思想 ( 模型或模式结构 | 数据挖掘任务 | 评分函数 | 搜索和优化算法 | 数据管理策略 )
- ChatGPT版必应搜索悄悄上线又下线,但评测已经出炉
- 微软必应搜索将迎来自己的人工智能助手
- 操作Redis的API操作:最佳实践(redis的api)
- Linux文件系统API的运用(linux文件操作api)
- Oracle组合查询:实现复杂的数据搜索(oracle组合查询)
- 使用Linux系统API函数实现功能(Linux系统api函数)
- 用图片搜索视频是一种什么样的技术? | 雷锋网公开课
- 轻松学会Linux命令less搜索的技巧(linuxless搜索)
- Oracle函数API:能够极大提升编程效率(oracle函数api)
- 深入理解Linux内核API(linux内核api)
- 一键搜索:Linux探索IP地址之旅(linux搜索ip地址)
- Oracle数据库入门指南API快速入门(oracle入门api)
- API技术连接MySQL数据库的最佳方法(api如何连接mysql)
- 妙用API连接Oracle,轻松实现跨平台连接(api连oracle)
- 利用jQuery实现可输入搜索文字的下拉框
- python中使用百度音乐搜索的api下载指定歌曲的lrc歌词