Elasticsearch应用(九)
1.搜索结果处理包括什么
- 排序
- 分页
- 高亮
- 返回指定字段
2.排序
介绍
Elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序
支持排序的字段
- keyword
- 数值
- 地理坐标
- 日期类型
排序语法
GET /[索引名称]/_search
{
"query":{"match_all":{}},
"sort":[
{
"字段名称":"desc"
}
]
}
GET /[索引名称]/_search
{
"query":{"match_all":{}},
"sort":[
{
"_geo_distance":{
"字段名称":"维度,经度",
"order":"asc",
"unit":"km"
}
}
]
}
注意
- 排序分为:asc,desc
- 地理坐标字段排序和其他字段的排序语法不一样
- 可以根据多个字段排序
- 做了排序就没有相关性算分了
3.分页
介绍
Elasticsearch默认情况下只返回TOP10的数据。而如果查询更多数据就需要修改分页参数了
排序语法
GET /[索引名称]/_search
{
"query":{"match_all":{}},
"from":990, // 分页开始的位置,默认为0
"size":10, // 获取多少条
"sort":[
{"price":"asc"}
]
}
默认分页限制
from + size的结果必须小于或等于10000,否则会出现异常,虽然可以通过配置解除这个i限制,但是不建议这么做,建议采用其他方式解决
ES与分页
ES底层是倒排索引,它的结构是不利于做分页的,ES采用的实际上是一种逻辑上的分页,如果获取990-1000的数据,那么ES会排序获取前1000条数据,然后截取990-1000,在集群环境下会出现深度分页问题
深度分页
深度分页问题
解决方案
- search after: 分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。问题是只能向后查,不能向前查
- scroll: 原理是将排序数据形成快照,保存在内存。官方已经不推荐使用
scroll语法
# 1m,说明采用游标查询,保持游标查询窗口一分钟
GET /[index]/_search?scroll=1m
{
"query":{"match_all":{}},
"size":20
}
GET /_search/scroll
{
"scroll":"1m",
"scroll_id":"返回的id"
}
分页总结
4.高亮
介绍
就是在搜索结果中把搜索关键字突出显示
原理
- 将搜索结果中的关键字用标签标记出来
- 在页面中给标签添加CSS样式
排序语法
GET /[索引名称]/_search
{
"query":{
"match":{
"字段名称":"值"
}
},
"highlight":{
"fields":{ // 指定要高亮的字段
"字段名称":{
"fragment_size":100, // 返回高亮数据的最大长度
"number_of_fragments":5, // 返回结果最多可以包含几段不连续的文字
"pre_tags":"<em>" // 用来标记高亮字段的前置标签
"post_tags":"</em>" // 用来标记高亮字段的后置标签
"require_field_match":"false" // 高亮字段是否需要跟搜索字段匹配
}
}
}
}
注意
- 要使用高亮,那么查询一定不能使用类似于match_all的查询,需要使用带关键字的查询,因为高亮是给关键字高亮的
- 默认情况下,ES搜索字段必须与高亮字段一致
5.返回指定字段
GET /[index]/_search
{
"query":{"match_all":{}},
"_source":["字段名1","字段名2"]
}