排序:
es支持对搜索结果排序,默认是根据相关度算分,来排序,可以排序字段
类型有:keyword类型,数值类型,地理坐标类型,日期类型等
案列:
分页:
es默认情况下只返回top10的数据,而如果要查询
更多数据就需要修改分页参数了。
分页参数: form size 参数来控制要返回的分页结果
#分页查询:
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "asc"
}
}
],
"from": 0,
"size": 10
}
深度分页问题:
es是分布式,所以面临深度分页问题。列如按price
排序后获取from = 90 size =10 的数据
而一旦做了集群es就会把数据进行拆分
放到不同的机器上
- 首先在每个数据分片上都排序查询前1000条文档
- 然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档
- 最后从这个1000条中 选取990开始的十条文档
如果搜索页数过深或者结果集(from+szie)越大
对内存和cpu的消耗也越高 因此ES设定结果集上限是10000
在实际业务当中从业务角度说公司是会让你禁止分页到一万条
如果真的有这样的需求怎么办?
总结:
form+size:
- 优点:支持随机翻页
- 缺点:深度分页问题 默认查询上限(from+size)
- 是一万
- 场景: 百度京东谷歌 淘宝都是随机翻页搜索
高量处理:
把关键字把它突出显示出来。
那么如何实现的?
将搜索结果中的关键字用标签标记起来
在页面中给标签添加css样式
我只需要告诉es给那个字段加标签,加什么标签
我可以指定多个字段高亮
在默认情况下 es 搜索字段必须与高亮字段一致否则不会高亮