Query DSL
这是一个基于 JSON 定义的查询语言,主要包含两种类型:
字段查询:如 term、match、range等,只针对某一字段进行查询
复合查询:如bool查询等,包含一个或多个字段类查询或复合查询语句
Query DSL- 字段类查询
字段类查询主要包含下面的两类:

match query
。这个语句就表示返回包含alfred或way的文档。

match query的流程

match query参数
在前面的查询中待查询语句满足其中的一个即可,es提供了一个参数用来表示查询语句匹配关系:
---这个例子中就表示必须同时包含alfred和way

相关性算分
在match query流程中,汇总的分的过程是es根据内部的相关性算分算法(TF/IDF、BM25等)进行计算的。在es5.x版本后默认使用BM25算法进行相关性算分。
相关性算分是指文档与查询语句之间的相关度(relevance)。其本质是一个排序问题,就是当通过倒排索引获取到匹配的文档列表后,如何将最符合用户需求的文档排在前列。
相关性算分具有如下的重要概念:


BM25算法中BM指的是BEST MATCH,25指的是迭代了25次才计算方法,是针对TF/IDF的一种优化,计算公式如下:


match phrase query
对字段有检索,有顺序要求,API如下:
----这个例子是:匹配java和engineer关键字的文档,且java要在engineer前面。

match phrase query参数
通过slop参数控制单词间的间隔:
这样额话,就表示允许匹配的文档可以与 java engineer有一个距离的差异。这样,java senior engineer这样的字段就可以返回了。

query string query
类似于 URI search中的q参数查询:
这个例子就表示返回返回username字段中包含alfred和way的文档

这个表示查询username 和 job字段,条件是包含alfred或同时包含java和ruby


simple query string query
类似于query string,但是会忽略掉错误的查询语法,并且仅支持部分的查询语法。不能使用 AND,OR,NOT等关键词,使用 +代替AND, | 代替OR,- 代替 NOT。

Term query
将查询语句作为一个整体进行查询,不进行分词:

Terms query
一次传入多个单词进行查询:

range query
范围查询主要针对日期和数值类型:


Date Math是针对日期的一种更友好的计算格式:

主要的时间单位有:y(year)、M(months)、w(week)、d(days)、h(hours)、m(minutes)、s(seconds)

复合查询
复合查询是指包含字段类查询或复合查询的类型,主要有以下几种:
- constant_score query
- bool query
- dis_max query
- function_score query
- boosting query
constant_score query将其内部的查询结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分
:
在返回的结果中,_score的值全部为1
bool query由一个或多个bool子句组成,主要包含以下4个:


filter查询只返回符合条件的文档而不关心相关性,不进行相关性算分。es对filter有智能缓存,所以其执行效率很高。所以在执行简单查询而不考虑相关性的时候推荐使用filter代替query等。

执行结果中的_score的值为0,表示没有进行相关性算分
must指定了必须符合的条件:

must_not是指排除must_not中符合条件的文档:

should的使用有两种情况:
- bool查询中只包含should,不包含must查询
- bool查询中同时包含should和must查询


query context 和filter context的区别


count api
这个api是用于返回符合条件的文档数,endpoint为_count

source filtering
过滤返回结果中_source的字段,节省网络开销:

本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/12833275.html
浙公网安备 33010602011771号