我是靠谱客的博主 单薄时光,最近开发中收集的这篇文章主要介绍ES DSL语法搜索结果处理 排序、分页、高亮,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.es排序

elasticsearch支持对搜索结果排序icon-default.png?t=M1L8https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等

#sort 排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score": "desc"
    },
    {
      "price":"asc"
    }
  ]
}

获取经纬度的方式:获取鼠标点击经纬度-地图属性-示例中心-JS API 2.0 示例 | 高德地图API

 实现对酒店数据按照到你的位置坐标的距离升序排序

#找到121.43515,31.155175周围的酒店,距离升序排序(排序之后 打分算法不执行)
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 31.155175,
          "lon": 121.43515
        },
        "order": "asc"
        , "unit": "km"
      }
    }
  ]
}

2.es分页

 es为倒叙索引

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

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

#from 分页开始的位置,size 查询数量   
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ],
  "from": 0, 
  "size": 20
}

ES是分布式的,所以会面临深度分页问题。例如按price排序后,获取from = 990size =10的数据:

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

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

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

search after :分页时需要排序, 原理是从上一次的排序值开始,查询下一页数据。官方 推荐使用的方式。
scroll :原理 将排序数据形成快照,保存在内存。 官方已经不推荐使用。

from + size

优点:支持随机翻页
缺点:深度分页问题,默认查询上限( from + size )是 10000
场景:百度、京东、谷歌、淘宝这样的随机翻页搜索

after search

优点:没有查询上限(单次查询的 size 不超过 10000
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

scroll

优点: 没有查询上限(单次查询的 size 不超过 10000
缺点:会有额外内存消耗,并且搜索结果是非实时的

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

3.高亮

 高亮:就是在搜索结果中把搜索关键字突出显示

原理是这样的:

将搜索结果中的关键字用标签标记出来
在页面中给标签添加 css 样式
#高亮查询,默认情况下,ES搜索字段必须与高亮字段一致
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}
#高亮查询,默认情况下,ES搜索字段必须与高亮字段一致
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": { 
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

总结

GET /hotel/_search
{
  "query": {
    "match": {
      "name": "如家"
    }
  },
  "from": 0, // 分页开始的位置
  "size": 20, // 期望获取的文档总数
  "sort": [ 
    {  "price": "asc" }, // 普通排序
    {
      "_geo_distance" : { // 距离排序
          "location" : "31.040699,121.618075", 
          "order" : "asc",
          "unit" : "km"
      }
    }
  ],
  "highlight": {
    "fields": { // 高亮字段
      "name": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}

最后

以上就是单薄时光为你收集整理的ES DSL语法搜索结果处理 排序、分页、高亮的全部内容,希望文章能够帮你解决ES DSL语法搜索结果处理 排序、分页、高亮所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部