排序:

es支持对搜索结果排序,默认是根据相关度算分,来排序,可以排序字段
类型有:keyword类型,数值类型,地理坐标类型,日期类型等
image.png

案列:

image.png

image.png

image.png

分页:

es默认情况下只返回top10的数据,而如果要查询
更多数据就需要修改分页参数了。

分页参数: form size 参数来控制要返回的分页结果

image.png

  1. #分页查询:
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match_all": {}
  6. },
  7. "sort": [
  8. {
  9. "price": {
  10. "order": "asc"
  11. }
  12. }
  13. ],
  14. "from": 0,
  15. "size": 10
  16. }

image.png
深度分页问题:
es是分布式,所以面临深度分页问题。列如按price
排序后获取from = 90 size =10 的数据

而一旦做了集群es就会把数据进行拆分
放到不同的机器上
image.png

  • 首先在每个数据分片上都排序查询前1000条文档
  • 然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档
  • 最后从这个1000条中 选取990开始的十条文档

如果搜索页数过深或者结果集(from+szie)越大
对内存和cpu的消耗也越高 因此ES设定结果集上限是10000

在实际业务当中从业务角度说公司是会让你禁止分页到一万条

如果真的有这样的需求怎么办?
image.png
总结:
form+size:

  1. - 优点:支持随机翻页
  2. - 缺点:深度分页问题 默认查询上限(from+size
  3. - 是一万
  4. - 场景: 百度京东谷歌 淘宝都是随机翻页搜索

image.png

高量处理:

把关键字把它突出显示出来。
那么如何实现的?
将搜索结果中的关键字用标签标记起来
在页面中给标签添加css样式

我只需要告诉es给那个字段加标签,加什么标签

image.png

我可以指定多个字段高亮
image.png
在默认情况下 es 搜索字段必须与高亮字段一致否则不会高亮
image.png

image.png