Elastic Search之Search API(Query DSL)、字段类查询、复合查询

search api就是对存储在elastic search(以下简称es)中的数据进行查询的相关API,可以类比mysql中的select语句。es中的search主要分为URI Search和Query DSL,其中又以Query DSL语法为主,也是我们学习es所要重点掌握的,例如如下的查询:

es的Query DSL以_search为endpoint,主要分为字段类查询和复合查询()。字段类查询:只针对某一个字段进行查询,如match、term等; 复合查询:可以进行一个或多个字段的查询,如bool查询等.


字段类查询主要包括两类:单词匹配和全文匹配单词匹配(Term Level Query):不对查询语句进行分词处理,直接匹配该字段的倒排索引;全文匹配(Full Text Query):对指定的text类型的字段进行全文检索,会先对查询语句进行分词处理,例如你输入的查询文本是"我在马路边",es在分词器的作用下就会分词为"我"、"在"、"马路"这么几个单词,然后再去匹配。

books 字段类查询

books 全文匹配:包括match、match_phrase、query_string、simple_query_string查询语句;

books match query

match query是最基本的基于全文检索的字段类查询语法,api使用如下:

那么这里经过分词后的this、is、a、test各个单词之间就是默认为"或"的匹配关系,可以通过operator关键字来显式设置各个单词间的匹配关系,如下:

也可以通过minimum_should_match参数来设置控制需要匹配的单词数,比如你的文档里username存的内容是"this is a java enginer",那么通过下面的查询语句可以控制查询文本最少要匹配到"java"、"enginer":

books match_phrase query

match_phrase也是对字段进行检索,和match的区别在于:match_query是有顺序要求的,而match是无序的。

可以通过slop参数来控制单词之间的允许间隔:

books query_string query

query_string支持多字段匹配:

books simple_query_string语法与query_string类似,但是不支持AND、OR、NOT,分别需要用"+"、"|"、"-"号代替。

books 单词匹配:包括term、terms、range查询语句:

books term query

term查询语句不会对查询语句进行分词处理,直接拿查询输入的文本去检索,如下是官方文档测试案例,非常清晰:

books terms query

terms和term的查询语法基本类似,但terms支持的查询文本可以多个:

此外,terms还支持文档元数据信息的几个字段值查询:

books range query

范围查询主要用于date或number类型的字段查询中,和term、terms查询一样,不进行查询时分词:

其中gte表示大于等于,lte表示小于等于,gt表示大于,lt表示小于,boost表示对此次query进行相关性算分权重,默认是1.0

在range范围查询中,es提供了一种更加简便的日期计算,now表示当前时间,时间单位y:年,M:月,d:天,H:时,m:分,s:秒,所以now-3y就表示当前时间减去3年后的时间。

如上几种是常用的字段类查询语法,更多的查询语法可以参看官网: https://www.elastic.co/guide/en/elasticsearch/reference/6.3/index.html,里面的Query DSL项。


books 复合查询

复合查询就是指可以对多个字段过滤筛选,类比mysql的where多条件查询,es的复合查询包括Constant Score Query、Bool Query、Dis Max Query、Function Score Query、Boosting Query,这里详细说一说用的比较多的Bool Query。

Bool Query是由一个或多个bool子句构成的,包括:

must

根据must中的条件过滤文档,返回的结果文档必须严格匹配条件,会影响相关性算分

filter

根据must中的条件过滤文档,返回的结果文档必须严格匹配条件,和must不同的是,filter不会影响相关性算分

should

根据should中的条件进行筛选,返回的结果文档应该包含should的条件,影响相关性 算分

must_not

根据must_not中的条件过滤文档,返回的结果文档必须不包含must_not条件,会影响相关性算分

Bool查询的基本语法如下:

1、must、must_not、should支持数组,同时filter的查询语句,es会对其进行智能缓存,因此执行效率较高,在不需要算分的查询语句中,可以考虑使用filter替代普通的query语句;

2、查询语句同时包含must和should时,可以不满足should的条件,因为must条件优先级高于should,但是如果也满足should的条件,则会提高相关性算分;

3、可以使用minimum_should_match参数来控制应当满足条件的个数或百分比;

4、must、must_not语句里面如果包含多个条件,则各个条件间是且的关系,而should的多个条件是或的关系。


books 上一篇: Elastic Search之自定义Mapping结构

books 下一篇: Elastic Search之Count API(获取符合条件的记录数)

books 参考资料: Es官方文档https://www.elastic.co/guide/en/elasticsearch/reference/6.3/index.html

发布了202 篇原创文章 · 获赞 571 · 访问量 147万+

猜你喜欢

转载自blog.csdn.net/fanrenxiang/article/details/86477019
今日推荐