前言

之前得文章解析过ES的应用场景及核心概念,包括介绍基本结构及使用方式,以及各个版本之间的适配,以及type类型的弱化,以及其中分词器的选择等。本篇文章会继续介绍最常用的查询语法的api,request的请求方式,高级的查询方式 以及dsl是什么,dsl语法等。

搜索API(_search API)

对于一般的搜索api 在官网中给我们展示的是 search ,包括uri search  

es简单查询q语法 es查询数据语法_中间件

要的是 Request body Search  ,在其中简单就是 实现的方式,的例子

es简单查询q语法 es查询数据语法_database_02

 在实现 查询时,可以 针对的属性进行设置,包括查询 ,排序  属性  sort. 第一层级 查询的语句

es简单查询q语法 es查询数据语法_中间件_03

在使用时,排序 指定sort ,根据字段 进行排序,在使用时,可以组装起来进行使用,这里面 判断 state 进行排序。需要查看类型 然后进行排序的。

es简单查询q语法 es查询数据语法_中间件_04

 在ES中,如果是integer的类型, 排序 并 用max 或者 min 等函数进行排序, 

es简单查询q语法 es查询数据语法_中间件_05

按照聚合值进行排序这些。还可以多个值进行排序 分页,

es简单查询q语法 es查询数据语法_es简单查询q语法_06

 在官网,对于from+size 需要小于等于10000.,这个是由于,在分片取数据时,并不能保证 每个分片的数据平均的排序数据,因此在取时,每个分片都要取,因此数据量太大会导致性能问题,因此只能做限制。

es简单查询q语法 es查询数据语法_es简单查询q语法_07

es简单查询q语法 es查询数据语法_搜索_08

每次都要去取数据 

官网中提出 对于分页,并不适合用于交互式的场景。

es简单查询q语法 es查询数据语法_database_09

 可以采用 不用form size的方式 ,先指定size  和sort 排好过后 加上 search_after  查找之后的值,这种方式就可以

es简单查询q语法 es查询数据语法_database_10

通过callapse进行折叠数据,相同的值进行去重

es简单查询q语法 es查询数据语法_es简单查询q语法_11

 

 而且还可以采用多个字段进行折叠 inner_hit

es简单查询q语法 es查询数据语法_中间件_12

以及在搜索时,使用match  将 分隔进行搜索,并将得分匹配度, 

 

es简单查询q语法 es查询数据语法_es简单查询q语法_13

还可以添加最小过滤参数

es简单查询q语法 es查询数据语法_数据库_14

 对于第一级查询的关键字,这都是ES提供的。

并且提供了高亮的语句

es简单查询q语法 es查询数据语法_database_15

 

es简单查询q语法 es查询数据语法_数据库_16

 ES对于这种处理,也就是 反向索引时,会将下标位置 次数都会存下来。来达到高亮的情况。

Query DSL

es简单查询q语法 es查询数据语法_database_17

 DSL是什么:

  • Domain Specific Language:领域特定语言
  • Elasticsearch基于JSON提供完整的查询DSL来定义查询。

DSL包含两种断言(clause)


  • 叶子查询字句(Leaf query clauses)

Leaf query 断言在指定的字段上查询指定的值, 如:match, term or range queries.可 以单独使用.


  •  复合查询字句(Compound query clauses )

以逻辑方式组合多个叶子、复合查询为一个查询


也就是将叶子查询组合起来做事。

Query and filter context


Query and filter context


一个查询断言(clause)的行为,取决于它是用在query context 还是 filter context 中 。



es简单查询q语法 es查询数据语法_搜索_18


Match all query 


最单一的 query ,匹配所有的文档,并且 _score 都为 1.0


es简单查询q语法 es查询数据语法_中间件_19

不管怎么的,就把所有的文档进行查询出来,并且可以指定相关性得分。

es简单查询q语法 es查询数据语法_es简单查询q语法_20

 对于相反的,match_none

es简单查询q语法 es查询数据语法_搜索_21

Full text queries


full text queries 用来搜索被分词后的text类型字段,比如对邮件内容 进行搜索,搜索时,query string会使用索引数据时相同的analyzer进行分词。



 

es简单查询q语法 es查询数据语法_database_22

 文档索引时,先分词为反向索引。都会进行匹配,然后得到数据。

对于全文检索来说,最常用的match 

 

es简单查询q语法 es查询数据语法_搜索_23

 这里是按照or进行分词查询的。

es简单查询q语法 es查询数据语法_搜索_24

 把 符合条件的查询出来。 当然也可以设置为and.并且在基础上设置容错。这都是在es中可以使用的。

es简单查询q语法 es查询数据语法_es简单查询q语法_25

 这里还可以 指定查询的时候,间隔一个单词的情况,认为他是一个单词,也可以进行匹配。

es简单查询q语法 es查询数据语法_数据库_26

 并且可以指定多个字段进行查询匹配 

匹配数组的情况进行查询

es简单查询q语法 es查询数据语法_搜索_27

查询两个字符之间的数据进行查询

es简单查询q语法 es查询数据语法_数据库_28

 对于简单的查询语句, 这里  take 查询的情况。

es简单查询q语法 es查询数据语法_中间件_29

 

es简单查询q语法 es查询数据语法_数据库_30

Common terms query 


停用词  在文本中出现一些没有用不必检索的词,提高检索效率。


索引时应用停用词处理会影响查询精度?若不做停用词处理,会应向查询,如何协调这两个问题呢?


对于 


the brown fox


not happy



这些词,需要检索,但是被忽略掉了,会出现查询不到的情况。




Common terms query会区分高频词、低频词, 我们可以通过cutoff_frequency来指定一个分界值,将搜索文本中的词分为高频词和低频词,低频词的重要性高于高频词。


  • > 先对低频词进行搜索,并计算所有匹配文档相关性得分;
  • > 再搜索和高频词匹配的文档,这会搜到很多文档,不计算得分
  • > 取交集,交集中的文档进行高频词得分计算
  • > 高频词的得分和低频词得分相加,作为文档得分。实际执行的搜索是 必须包含低频词 + 或包含高频词。


思考:这样处理下,如果用户输入的都是高频词如 “to be or not to be”结果会是怎


样的?你希望是怎样的?


解决办法:如果都是高频词,让用户可以自己定对高频词做and/or 操作,自己定对低频


词进行and/or 操作;或指定最少得多少个同时匹配。


高低频词的得分计算

Term level queries


term-level queries 不会像 full text queries 那样对query string进行分词,而是直接在反向索引中匹配当前term,如果是对keyword字段查询时,会用被查询字段的normalizer进行标准化。



term-level queries 经常用于查询结构化数据,比如numbers、date ranges、IP addresses、prices、product IDs.


在es中 精确查询的格式,以及多字段选择的数据  相当于in


es简单查询q语法 es查询数据语法_中间件_31


 


es简单查询q语法 es查询数据语法_es简单查询q语法_32

对于这些文档 也可以采用  gte

 

es简单查询q语法 es查询数据语法_搜索_33

 查询时,使用  isnull,进行查询

es简单查询q语法 es查询数据语法_database_34

 

Compound queries


compound queries 会包裹其他 compound queries 或 leaf queries ,合并它们的查询结果及相关性得分,改变他们的行为。



找文档是否相关,评判文档是否相关性,判断 有多少相关性。


es简单查询q语法 es查询数据语法_中间件_35

 

es简单查询q语法 es查询数据语法_database_36

 

表示逻辑的部分,这里在使用时,结合起来,must_not 必须不存在  

es简单查询q语法 es查询数据语法_es简单查询q语法_37

 这里在es中 多个叶子的查询,每个叶子都会匹配到文档中。

es简单查询q语法 es查询数据语法_中间件_38