指定查询字段
默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source 的过滤
GET 请求 :http://127.0.0.1:9200/student/_search
{ "_source": ["name","nickname"], "query": { "terms": { "nickname": ["zhangsan"] } } }
过滤字段
我们也可以通过:
includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
GET 请求 :http://127.0.0.1:9200/student/_search
{ "_source": { "includes": ["name","sex"], "excludes": ["nickname"] }, "query": { "terms": { "nickname": ["zhangsan"] } } }
组合查询
bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "bool": { "must": [ { "match": { "name": "zhangsan" } } ], "must_not": [ { "match": { "age": "40" } } ], "should": [ { "match": { "sex": "男" } } ] } } }
错误说明:
age 在映射中是不能被索引的,无法查看。(后面的范围查询也会遇到)
这是由于在创建索引映射的时候 age 和 sex 的index设为了false,以下为错误截图。
如果大家想测试的话建议重新建个索引,然后进行映射关联 age和sex的index设置为true
正常结果返回应该为:
范围查询
range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符
操作符 | 说明 |
gt | 大于> |
gte | 大于等于>= |
lt | 小于< |
lte | 小于等于<= |
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "range": { "age": { "gte": 30, "lte": 35 } } } }
模糊查询
返回包含与搜索字词相似的字词的文档。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
更改字符(box → fox)
删除字符(black → lack)
插入字符(sic → sick)
转置两个相邻字符(act → cat)
为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。
通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "fuzzy": { "name": { "value": "zhangsan" } } } }
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "fuzzy": { "name": { "value": "zhangsan", "fuzziness": 2 } } } }
单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc升序。
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "match": { "name": "zhangsan" } }, "sort": [ { "age": { "order": "desc" } } ] }
多字段排序
假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序
GET 请求:http://127.0.0.1:9200/student/_search
{ "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } }, { "_score": { "order": "desc" } } ] }
高亮查询
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用 match 查询的同时,加上一个 highlight 属性:
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "match_all": {} }, "from": 0, "size": 2 }
全量查询
(一般配合使用分页使用,因为数据量大的时候… …)
GET/POST 请求 :http://127.0.0.1:9200/student/_search
请求体内容为:
{ "query": { "match_all":{ } } }
分页查询
from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
size:每页显示多少条、
GET/POST 请求 :http://127.0.0.1:9200/student/_search
请求体内容为:
{ "query": { "match_all": {} }, "from": 0, "size": 2 }
聚合查询
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。
对某个字段取最大值 max
GET 请求 :http://127.0.0.1:9200/student/_search
{ "aggs": { "max_age": { "max": { "field": "age" } } }, "size": 0 }
对某个字段取最小值 min
{ "aggs": { "min_age": { "min": { "field": "age" } } }, "size": 0 }
对某个字段求和 sum
{ "aggs": { "sum_age": { "sum": { "field": "age" } } }, "size": 0 }
对某个字段取平均值 avg
对某个字段的值进行去重之后再取总数
State 聚合