elasticsearch9-搜索结果处理

请添加图片描述
个人名片:

博主:酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

目录

  • 二、搜索结果处理
    • 1. 排序
    • 2. 分页
    • 3. 高亮

二、搜索结果处理

1. 排序

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

语法

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // 排序字段、排序方式ASC、DESC
    }
  ]
}

案例:酒店数据按照用户评价(score)降序排序,评价相同的按照价格(price)升序排序
elasticsearch9-搜索结果处理_第1张图片

案例:实现对酒店数据按照到你的位置坐标的距离升序排序
elasticsearch9-搜索结果处理_第2张图片

2. 分页

  1. elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。
  2. elasticsearch中通过修改from、size参数来控制要返回的分页结果:
    from:从第几个文档开始
    size:总共查询几个文档

基本语法:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0, // 分页开始的位置,默认为0
  "size": 10, // 期望获取的文档总数
  "sort": [
    {"price": "asc"}
  ]
}

示例:
elasticsearch9-搜索结果处理_第3张图片

from + size

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

深度分页问题

现在,我要查询990~1000的数据,语法:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990, // 分页开始的位置,默认为0
  "size": 10, // 期望获取的文档总数
  "sort": [
    {"price": "asc"}
  ]
}

示例:
查询190~192的数据
elasticsearch9-搜索结果处理_第4张图片

当需要查询的页数非常大是,分页深度较大是,汇总数据过多,对内存和CPU会产生非常大的压力。
使用下面的方法:

after search

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

scroll

  • 优点:没有查询上限(单次查询的size不超过10000)
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

3. 高亮

高亮显示的实现分为两步:
1.给文档中的所有关键字都添加一个标签,例如标签
2.页面给标签编写CSS样式

高亮的语法

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "",  // 用来标记高亮字段的前置标签
        "post_tags": "" // 用来标记高亮字段的后置标签
      }
    }
  }
}

示例:
elasticsearch9-搜索结果处理_第5张图片

注意:
高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。
默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮
如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false

示例

非搜索字段
未添加required_field_match=falseelasticsearch9-搜索结果处理_第6张图片
添加required_field_match=false elasticsearch9-搜索结果处理_第7张图片

总结

查询的DSL是一个大的JSON对象,包含下列属性:
query:查询条件
from和size:分页条件
sort:排序条件
highlight:高亮条件

你可能感兴趣的:(#,elasticsearch,elasticsearch,搜索引擎)