6.2 搜索结果处理
一、排序
默认排序是按照相关度算分来排序的,还可以排序的字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等
GET /索引库名称/_search { "query": { "match_all": {} }, "sort": [ // 简单类型排序 { "排序字段": "desc/asc" //排序方式,分DESC倒序 ASC正序 } ], "sort": [ // 地理坐标排序 { "_geo_distance": { "坐标字段": "纬度,经度", // 纬度:lat、经度:lon "order": "asc", "unit": "km" } } ] }
二、分页
默认情况下只返回前10 条,如果要查询更多数据就要修改分页参数了
es中通过修改from、size参数来控制要返回的分页结果:
GET /索引库名称/_search { "query": { "match_all": {} }, "from": 分页开始的位置, // 默认0 "size": 期望活的文档总数, // 默认10 "sort": [ {"排序字段": "asc"} // 排序 ] }备注:分页是逻辑分页,全查后再截取
深度分页区问题
ES是可以做分布式部署的,因此,会面临深度分页的问题,所以需要聚合所有的结果,重新排序,然后分页
ES限制,from+size需要小于10000
深度分页解决方案
search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据,官方推荐使用的方式
scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用
优缺点
from+size:
优点:支持随机翻页
缺点:深度分页问题,默认查询上线(from+size)是10000
场景:百度,谷歌,京东,淘宝这样的随机翻页搜索
after search:
优点:没有查询上线(单次查询的size不超过10000)
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
scroll:
优点:没有查询上线(单次查询的size不超过10000)
缺点:会有额外的内存消耗,并且搜索的结果是非实时的
场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议使用after search方案
三、高亮
高亮,就是在搜索结果中的搜索关键字突出显示
原理:
将搜索结果中的关键字用标签标记出来
在页面中给标签添加css样式
GET /索引库名称/_search { "query": { "match": { // 必须关键字查询 "字段名": "条件值" } }, "highlight": { "fields": { // 制定要高亮的字段 "字段名": { // 必须与上面查询的字段名相同 "pre_tags": "<em>", // 标记高亮的前置标签 "post_tags": "</em>" // 标记高亮的后置标签 } } } }
最后更新于
这有帮助吗?