ElasticSearch漫游 (9.DSL查询结果处理:排序、分页、高亮)

排序

对搜索结果排序是我们使用ES过程中非常常见的一个场景:

通用语法为:

{
  "query": {
    // 查询语句
  },
  "sort": [
    { "field1": "asc" },
    { "field2": { "order": "desc" } }
  ]
}

在上述示例中,你可以根据自己的需求修改"query"部分来定义你的查询语句。而在"sort"部分,我们指定了两个排序条件。第一个条件是按照"field1"字段进行升序排序("asc"表示升序,"desc"表示降序)。第二个条件是按照"field2"字段进行降序排序。

你可以根据自己的需求添加更多的排序条件,也可以使用不同的排序顺序来满足你的排序需求。

将上述查询请求发送到Elasticsearch进行查询后,返回的结果将按照指定的排序条件进行排序。

请注意,排序是在查询结果上执行的,因此可能会对性能产生一些影响。在处理大量数据时,请考虑使用适当的索引和优化方法来提高查询性能。


ES中允许排序的字段类型很多: keyword 数值类型 地理坐标类型 日期类型。
默认是使用相关度算分(_score)来排序。

用前几篇的例子试一下:

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

这里排的顺序是有讲究的 写在前面的优先排序

这里还有个细节,ES底层是分片存储的如果你不知道size的话 match_all 查到的是一部分数据 不是所有数据。

分页

查询分页是最最最常用的场景了 这块新手一定要掌握好基础。熟悉基础之后 你就能理解学习更复杂的分页了。

分页常用的字段是 from+size 。 和数据库基本一模一样:

GET /hotel/_search
{
 "query": {
    "match_all": {}
 },
 "sort": [
   {
     "score":"desc"
   }
 ],
 "from": 10,
 "size": 20
}

好像很简答对吧。 但是考虑一个问题,如果你有100000条数据,

你现在分页要查 (100000-10,100000) 这10条数据,如果你直接传100000-10给from, 那么这个from会非常大,影响很多性能。

所以这里 介绍一种ES的分页特性:

search_after

这个东西怎么用呢? 很简单 我们先查第一页10条数据:

首先,执行初始查询来获取第一页的结果。在这个示例中,我们使用一个基本的match_all查询,并按照某个字段进行排序(假设字段名为sort_field):

json
Copy code
POST /your_index/_search
{
  "size": 10,
  "sort": [
    { "sort_field": "asc" }
  ]
}
在上述示例中,我们设置了size参数为每页返回的文档数量,这里设为10。查询结果将按照sort_field字段的升序排序。

接下来,在获取到第一页的结果后,从响应中提取最后一个文档的排序值(sort_field字段的值),并将其作为下一页查询的search_after参数值。

例如,假设第一页的响应如下:

json
Copy code
{
  "hits": {
    "hits": [
      { "id": "doc1", ... },
      { "id": "doc2", ... },
      ...
      { "id": "doc10", ... }
    ]
  },
  "sort": [
    12345
  ]
}
在上述示例中,我们可以看到最后一个文档的排序值为12345。

然后,使用这个排序值执行下一页的查询,将它作为search_after参数的值:

json
Copy code
POST /your_index/_search
{
  "size": 10,
  "sort": [
    { "sort_field": "asc" }
  ],
  "search_after": [12345]
}
这个查询将返回下一页的结果,以此类推,你可以重复这个过程来获取更多页的结果。

请注意,每次使用search_after进行分页查询时,你需要确保排序字段的唯一性和稳定性。如果排序字段存在重复值或频繁变动,可能会导致分页结果的不准确性。

使用search_after进行分页查询可以提供更好的性能和稳定性,尤其在处理大型结果集时。它减少了跳过大量文档的开销,并保持了相对一致的查询性能。

这样就大大优化了性能。

然后,,,, 还没完。

上面是单点的情况, 那如果是集群的情况呢??

新手可能会问? 这有什么区别吗???

集群的情况下 情况会变的很复杂 这个复杂体现在:

庞大的数据量 集群下可能是几千台机器 千万条数据

所以ES有一个设计 这个查询上限不能超过10000.

大家可以去试试百度 京东 淘宝这些搜索引擎页面, 查网页 查商品。 你会发现查询的结果结果集(from+size)都是有一个上限的。

高亮

高亮显示就是搜索中把关键字突出。这个在我们网页搜索中也是很常见的。
这个高亮怎么做呢?

将搜索结果关键字用标签记出来

在这里插入图片描述
就 ok了。
标记好 之后, 你就不用管了 具体让它怎么亮的工作 就交给前端了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值