搜索结果处理

排序

elasticsearch支持对搜索结果排序(sort),默认是根据相关度算分来排序,可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

举例:

对酒店评分降序排序,价格升序排序

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

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

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

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
"sort": [
  {
    "_geo_distance": {
      "location": {
        "lat": 31.034661,    //纬度
        "lon": 121.612282   //经度
      },
      "order": "asc",
      "unit": "km"
    }
  }
]
}

分页

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

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

#分页查询
GET /hotel/_search
{
  "query": {
    "match_all": {
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "from": 0 ,
   "size": 20   #期望获取文档的总数

深度分页问题:

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

1、首先在每个分片数据上都排序并查询前1000条文档

2、然后将所有节点的结果聚合,从内存中重新排序选取前1000条文档

3、最后从这1000条文档中,选取从990开始的10条文档

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

解决方案:

after search :分页时需要排序,原理上是从上一次的排序值开始,查询下一条数据(推荐)

优点:没有查询上线

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

场景:没有随机翻页需求的搜索

sroll:原理将排序数据形成快照,保存在内存中(不推荐)

对搜索结果高亮处理

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

原理是:

将搜索页面的关键字用标签标记出来(标签)

将页面中给标签添加css样式

在em中,默认情况下,搜索字段必须与高亮字段一致

GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}