ElasticSearch查询之——Search API
实现对ES中存储的数据进行查询分析,使用的关键字是 _search ,比如下面的API
小例子:查询job字段中包含java的文档,结果根据age属性进行升序排序,返回第1个文档,如果超过1s没有结束,则以超时结束。
多词匹配之间使用空格进行隔开,词语之间的关系为 “或”
若想使用词语匹配,需要用双引号括起来
泛查询在之前其实就有演示过,即像 q = xiaoming 这种不指定检索字段范围,会在所有字段中进行检索的查询即称为泛查询。反之,如果指定了字段,就能大大缩小范围。常见的指定字段的方式为 字段:检索条件字符 。
SearchURI中也可以使用和和 Query DSL 类型的布尔操作符,不过具体的使用规则略有不同,具体的规则如下:
需要注意的是, “+” 号在url中会被解析为空格,要使用encode后的结果才可以,我们需要用%2B来替代一下。
范围查询支持数据范围和日期范围的查询,具体的表达式写法有两种方式:
Query URI 支持我们使用通配符来进行模糊查询, ? 表示一个字符, * 表示一个或者多个字符
注意: 通配符匹配执行效率低,且占用较多内存 ,数据较多时不建议使用
如无特殊需求,不要将 ?/* 放在最前面(因为会加大匹配的范围,降低匹配效率)
Query URI 支持我们使用正则表达式来进行检索
当我们对于检索条件字符不明确时, Query URI 支持我们使用近似值来作为模糊查询的条件,这个和之前的通配符不太一样,通配符很多时候是基于我们清楚某一段字符中的某个区间内容了(比如说最终的结果是 xiaoming ,我们可以根据知道的字符进行匹配,比如 xiao* 、 *ming )。而近似值匹配可以是众多模糊匹配的并集。
Request Body Search 字如其意,就是通过在 body 中添加请求体来实现搜索。我们在第二节中学习了 Query URI 的众多语法可能会觉得它已经很强大,但实际上第三节的将要介绍的 Query DSL 会更加强大和灵活,不仅支持URI写法的所有语法,还支持更多高阶的语法查询。也是我们日常工作中更为常用的一种检索方式。
字段类的查询可以分为全文匹配和单词匹配,两者的区别在于会不会对查询语句进行分词后处理,全文匹配会(match、match_phrase),单词匹配(term、terms、range)不会。
该方法用于对字段作检索,对字段有顺序要求
Query String Query 其实就相当于 Query URI 的请求体写法
Simple Query String Query 类似于Query String,但是会忽略错误的查询语法,并且仅支持部分查询语法。其常用的逻辑符号如下,不能使用AND、OR、NOT等关键词,而是要对应地使用 + | - 。
Term Query 将查询语句作为整个单词进行查询,即不对查询语句做分词处理
terms query 和 term query 类似,差别在于后者可以同时支持多个全词匹配
Query DSL 支持我们使用 Range Query 来使用范围匹配
拓展:
我们可以发现,之前列举的字段类查询只能够满足单个字段查询条件的使用,当涉及到多个字段时,字段类查询的 match 和 term 等API就无能为力了。满足这种多字段检索需要的方式是使用复合查询。
·复合查询是指包含字段类查询或复合查询的类型,主要包括以下几类∶ constant_score query 、 bool query 、 dis_max query 、 function_score query 、 boosting query
这里的话,主要讲一下布尔查询 Bool Query
当我们不需要获取详细的文档信息,只需要获取命中的文档数量时,就可以使用count来获取我们想要的结果。
当我们只需要获取命中文档的指定字段值时,我们可以通过source来指定我们需要es返回的值