ES查询语法解析

Posted 踩踩踩从踩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES查询语法解析相关的知识,希望对你有一定的参考价值。

ES应用场景及核心概念二_踩踩踩从踩的博客-CSDN博客

ES应用场景及核心概念一_踩踩踩从踩的博客-CSDN博客_es适用场景

前言

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

搜索API(_search API)

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

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

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

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

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

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

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

每次都要去取数据 

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

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

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

 

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

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

 

还可以添加最小过滤参数

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

并且提供了高亮的语句

 

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

Query DSL

 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 中 。

Match all query 

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

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

 对于相反的,match_none

Full text queries

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

 

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

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

 

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

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

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

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

匹配数组的情况进行查询

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

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

 

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

 

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

 

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

 

Compound queries

compound queries 会包裹其他 compound queries leaf queries ,合并它们的查询结果及相关性得分,改变他们的行为。
找文档是否相关,评判文档是否相关性,判断 有多少相关性。

 

 

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

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

以上是关于ES查询语法解析的主要内容,如果未能解决你的问题,请参考以下文章

ReactNativereact native 中es6语法解析

lucene查询解析器语法

elasticsearch 7.6.2 - 索引管理

Generator函数语法解析

使用 JPA 解析琐碎查询的语法错误

解析 Cloud Code 关系查询语法