6.2 搜索结果处理

一、排序

  1. 默认排序是按照相关度算分来排序的,还可以排序的字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等

    GET /索引库名称/_search
    {
        "query": {
            "match_all": {}
        },
        "sort": [     // 简单类型排序
            {
                "排序字段": "desc/asc"  //排序方式,分DESC倒序  ASC正序
            }
        ],
        "sort": [      // 地理坐标排序
            {
                "_geo_distance": {
                    "坐标字段": "纬度,经度",  // 纬度:lat、经度:lon
                    "order": "asc",
                    "unit": "km"
                }
            }
        ]
    }

二、分页

  1. 默认情况下只返回前10 条,如果要查询更多数据就要修改分页参数了

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

    GET /索引库名称/_search
    {
        "query": {
            "match_all": {}
        },
        "from": 分页开始的位置,    // 默认0
        "size": 期望活的文档总数,  // 默认10
        "sort": [
            {"排序字段": "asc"}   // 排序
        ]
    }

    备注:分页是逻辑分页,全查后再截取

  3. 深度分页区问题

    1. ES是可以做分布式部署的,因此,会面临深度分页的问题,所以需要聚合所有的结果,重新排序,然后分页

    2. ES限制,from+size需要小于10000

  4. 深度分页解决方案

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

    2. scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用

  5. 优缺点

    1. from+size:

      1. 优点:支持随机翻页

      2. 缺点:深度分页问题,默认查询上线(from+size)是10000

      3. 场景:百度,谷歌,京东,淘宝这样的随机翻页搜索

    2. after search:

      1. 优点:没有查询上线(单次查询的size不超过10000)

      2. 缺点:只能向后逐页查询,不支持随机翻页

      3. 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

    3. scroll:

      1. 优点:没有查询上线(单次查询的size不超过10000)

      2. 缺点:会有额外的内存消耗,并且搜索的结果是非实时的

      3. 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议使用after search方案

三、高亮

  1. 高亮,就是在搜索结果中的搜索关键字突出显示

    原理:

    1. 将搜索结果中的关键字用标签标记出来

    2. 在页面中给标签添加css样式

    GET /索引库名称/_search
    {
        "query": {
            "match": {  // 必须关键字查询
                "字段名": "条件值"
            }
        },
        "highlight": {
            "fields": {  // 制定要高亮的字段
                "字段名": {  // 必须与上面查询的字段名相同
                    "pre_tags": "<em>",  // 标记高亮的前置标签
                    "post_tags": "</em>"  // 标记高亮的后置标签
                }
            }
        }
    }

最后更新于

这有帮助吗?