• es搜索功能——DSL查询文档——搜索结果处理


    1、排序

    elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序

    可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

    text不可以排序!!!

    1.1.普通字段排序

    语法

    1. GET /indexName/_search
    2. {
    3.   "query": {
    4.     "match_all": {}
    5.   },
    6.   "sort": [
    7.     {
    8.       "FIELD""desc"  // 排序字段、排序方式ASC、DESC
    9.     }
    10.   ]
    11. }

    示例:

    1. # 查询结果处理-排序
    2. # query 查询语句
    3. # sort 排序语句
    4. # 默认是按照相关性算分排序,如果采用其他字段排序,相关性算分则为null
    5. # price 排序字段名()按照哪个字段排序
    6. # price后边是排序规则,可以写多个排序规则,这是简写版
    7. GET /hotel/_search
    8. {
    9. "query": {
    10. "match": {
    11. "name": "如家"
    12. }
    13. },
    14. "sort": [
    15. {
    16. "price": "asc"
    17. },
    18. {
    19. "score":"desc"
    20. }
    21. ]
    22. }

     1.2.地理坐标排序

    示例:

    1. # 查询结果处理-排序(距离排序)
    2. GET /hotel/_search
    3. {
    4. "query": {
    5. "match": {
    6. "name": "如家"
    7. }
    8. },
    9. "sort": [
    10. {
    11. "_geo_distance": {
    12. "location":"22.602582, 114.123284",
    13. "order": "asc",
    14. "unit": "km"
    15. }
    16. }
    17. ]
    18. }

     

    2、分页

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

    elasticsearch中通过修改from、size参数来控制要返回的分页结果:

    • from:从第几个文档开始

    • size:总共查询几个文档

    2.1.基本的分页

    分页的基本语法如下:

    1. GET /hotel/_search
    2. {
    3.   "query": {
    4.     "match_all": {}
    5.   },
    6.   "from": 0, // 分页开始的位置,默认为0
    7.   "size": 10, // 期望获取的文档总数
    8.   "sort": [
    9.     {"price""asc"}
    10.   ]
    11. }

    示例:

    1. # 查询结果处理-分页
    2. GET /hotel/_search
    3. {
    4. "query": {
    5. "match_all": {}
    6. },
    7. "from": 2,
    8. "size": 2
    9. }

     分页限制问题,需要from + size <= 10000,否则会报错

    1. # 查询结果处理-分页(分页限制:from+size<=10000)
    2. GET /hotel/_search
    3. {
    4. "query": {
    5. "match_all": {}
    6. },
    7. "from": 10000,
    8. "size": 2
    9. }

     

    2.2.深度分页问题

    实际中es是集群部署,假设现在有10个节点,我要查询TOP100条数据,es会把每个节点的TOP100条数据查出来,汇总起来,重新排序,再查出TOP100条数据,这样效率太低,而且汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

    针对深度分页,ES提供了两种解决方案,官方文档

    • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。

    • scroll:原理将排序后的文档id形成快照,保存在内存。官方已经不推荐使用。

    3、高亮

    高亮显示的实现分为两步:

    • 1)给文档中的所有关键字都添加一个标签,例如标签

    • 2)页面给标签编写CSS样式

    高亮的语法

    1. GET /hotel/_search
    2. {
    3.   "query": {
    4.     "match": {
    5.       "FIELD""TEXT" // 查询条件,高亮一定要使用全文检索查询
    6.     }
    7.   },
    8.   "highlight": {
    9.     "fields": { // 指定要高亮的字段
    10.       "FIELD": {
    11.         "pre_tags""",  // 用来标记高亮字段的前置标签
    12.         "post_tags""" // 用来标记高亮字段的后置标签
    13.       }
    14.     }
    15.   }
    16. }

     示例:

    1. # 查询结果处理-高亮
    2. # highlight 固定写法
    3. # fields 固定写法
    4. # name 在哪个字段中的如家高亮显示
    5. # require_field_match 如果为false,表示查询时的字段和高亮使用的字段可以不一致
    6. # es默认的高亮的标签就是,可以不用指定
    7. GET /hotel/_search
    8. {
    9. "query": {
    10. "match": {
    11. "name": "如家"
    12. }
    13. },
    14. "highlight": {
    15. "fields": {
    16. "name": {
    17. "require_field_match": "false"
    18. }
    19. }
    20. }
    21. }

    注意:

    • 高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。

    • 默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮

    • 如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false

  • 相关阅读:
    隐私计算技术创新及产业实践研讨会:学习
    「运维有小邓」AD域委派
    基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
    leetcode-754-(每日一题)-到达终点数字-(中等,数学问题)
    肖sir__设计测试用例方法之等价类02_(黑盒测试)
    Java文件——File对象
    OA办公软件篇(三)—审批流
    SpringBoot中_JAVA利用国密算法_实现内容的加密_解密--SpringCloud工作笔记180
    Docker将本地的镜像上传到私有仓库
    WebShell 木马免杀过WAF
  • 原文地址:https://blog.csdn.net/LINING_GG/article/details/128194014