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"]
}
相关推荐
凉白开3382 分钟前
spark总结
大数据·分布式·spark
等雨季4 分钟前
Spark总结
大数据·分布式·spark
xυlai6 分钟前
Spark-Streaming
大数据·分布式·spark
神奇的黄豆8 分钟前
Spark-Streaming核心编程(四)总结
大数据·spark
lilye6617 分钟前
精益数据分析(26/126):依据商业模式确定关键指标
大数据·人工智能·数据分析
我爱刮刮乐40 分钟前
关于flink两阶段提交高并发下程序卡住问题
大数据·flink·linq
A达峰绮1 小时前
设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
大数据·开发语言·经验分享·新能源汽车
youka1502 小时前
大数据学习栈记——Hive4.0.1安装
大数据·hive·学习
冼紫菜2 小时前
[特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统
java·redis·分布式·后端·elasticsearch·rabbitmq·全文检索
APItesterCris4 小时前
Flutter 移动端开发:集成淘宝 API 实现商品数据实时展示 APP
大数据·数据库·flutter