09.Elasticsearch应用(九)

Elasticsearch应用(九)

1.搜索结果处理包括什么

  • 排序
  • 分页
  • 高亮
  • 返回指定字段

2.排序

介绍

Elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序

支持排序的字段

  1. keyword
  2. 数值
  3. 地理坐标
  4. 日期类型

排序语法

复制代码
GET /[索引名称]/_search
{
    "query":{"match_all":{}},
    "sort":[
        {
            "字段名称":"desc"
        }
    ]
}

GET /[索引名称]/_search
{
    "query":{"match_all":{}},
    "sort":[
        {
            "_geo_distance":{
                "字段名称":"维度,经度",
                "order":"asc",
                "unit":"km"
            }
        }
    ]
}

注意

  1. 排序分为:asc,desc
  2. 地理坐标字段排序和其他字段的排序语法不一样
  3. 可以根据多个字段排序
  4. 做了排序就没有相关性算分了

3.分页

介绍

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

排序语法

复制代码
GET /[索引名称]/_search
{
    "query":{"match_all":{}},
    "from":990, // 分页开始的位置,默认为0
    "size":10, // 获取多少条
    "sort":[
        {"price":"asc"}
    ]
}

默认分页限制

from + size的结果必须小于或等于10000,否则会出现异常,虽然可以通过配置解除这个i限制,但是不建议这么做,建议采用其他方式解决

ES与分页

ES底层是倒排索引,它的结构是不利于做分页的,ES采用的实际上是一种逻辑上的分页,如果获取990-1000的数据,那么ES会排序获取前1000条数据,然后截取990-1000,在集群环境下会出现深度分页问题

深度分页

深度分页问题
解决方案
  1. search after: 分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。问题是只能向后查,不能向前查
  2. scroll: 原理是将排序数据形成快照,保存在内存。官方已经不推荐使用

scroll语法

复制代码
# 1m,说明采用游标查询,保持游标查询窗口一分钟
GET /[index]/_search?scroll=1m
{
    "query":{"match_all":{}},
    "size":20
}

GET /_search/scroll
{
    "scroll":"1m",
    "scroll_id":"返回的id"
}

分页总结

4.高亮

介绍

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

原理

  1. 将搜索结果中的关键字用标签标记出来
  2. 在页面中给标签添加CSS样式

排序语法

复制代码
GET /[索引名称]/_search
{
    "query":{
        "match":{
            "字段名称":"值"
        }
    },
    "highlight":{
        "fields":{ // 指定要高亮的字段
            "字段名称":{
                "fragment_size":100, // 返回高亮数据的最大长度
                "number_of_fragments":5, // 返回结果最多可以包含几段不连续的文字
                "pre_tags":"<em>" // 用来标记高亮字段的前置标签
                "post_tags":"</em>" // 用来标记高亮字段的后置标签
                "require_field_match":"false" // 高亮字段是否需要跟搜索字段匹配
            }
        }
    }
}

注意

  1. 要使用高亮,那么查询一定不能使用类似于match_all的查询,需要使用带关键字的查询,因为高亮是给关键字高亮的
  2. 默认情况下,ES搜索字段必须与高亮字段一致

5.返回指定字段

复制代码
GET /[index]/_search
{
    "query":{"match_all":{}},
    "_source":["字段名1","字段名2"]
}
相关推荐
Aktx20FNz1 小时前
iFlow CLI 完整工作流指南
大数据·elasticsearch·搜索引擎
LaughingZhu2 小时前
Anthropic 收购 Oven 后,Claude Code 用运行时写了一篇护城河文章
大数据·人工智能·经验分享·搜索引擎·语音识别
学习3人组2 小时前
TortoiseGit冲突解决实战上机练习
大数据·elasticsearch·搜索引擎
Ln5x9qZC22 小时前
Flink SQL 元数据持久化实战
大数据·sql·flink
OYpBNTQXi2 小时前
Flink Agents 源码解读 --- (6) --- ActionTask
大数据·flink
A__tao3 小时前
Elasticsearch Mapping 一键生成 Go Struct,支持嵌套解析
elasticsearch·es
中金快讯3 小时前
济民健康医疗服务占比提升至46%!业务结构调整初见成效
大数据·人工智能
lizhihai_993 小时前
股市学习心得-尾盘半小时买入法
大数据
大大大大晴天️3 小时前
Hudi 生产问题排障-乱序Upsert入湖数据丢失
大数据·flink·hudi
zs宝来了3 小时前
Elasticsearch 索引原理:倒排索引与 Segment 管理
elasticsearch·索引·倒排索引·源码解析·segment