排序
对搜索结果排序是我们使用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了。
标记好 之后, 你就不用管了 具体让它怎么亮的工作 就交给前端了。