如何根据输入的id 的顺序输出结果,id 个数有500个,还有分页?
问题来源:https://t.zsxq.com/0cdyq7tzr
原生的 Elasticsearch 检索机制没有这个功能。那就意味着,咱们得自己实现。
如何实现呢?把用户给定的序列(非递增也非递减的无规律序列,如3、1、5、7),看成一维数组数据。
他们的数组的下标只能是0、1、2、3.....也就是说,下标是有序的。
那么接下来问题就转嫁为如何基于数组下标进行升序排序的问题?
借助 sort 排序的 script 脚步排序即可实现。
PUT /_cluster/settings
{
"transient": {
"indices.id_field_data.enabled": true
}
}
解读如下:
PUT /_cluster/settings 请求是 Elasticsearch 中用于更新集群设置的 API。这个特定请求的含义是,我们要更新集群的临时(transient)设置。
{"transient": {"indices.id_field_data.enabled": true}}
在这个请求中,我们设置了 indices.id_field_data.enabled 为 true。
这个设置用于控制 Elasticsearch 是否允许对 _id 字段进行 fielddata 访问。
默认情况下,这个设置是禁用的(false),因为访问 _id 字段的 fielddata 可能会消耗大量内存,并可能导致性能下降。
这里使用的 transient 属性意味着设置的更改是临时的,只在集群重启之前有效。当集群重新启动时,这个设置会被重置为默认值。如果您希望永久更改此设置,可以使用 persistent 属性:
PUT /_cluster/settings
{"persistent": {"indices.id_field_data.enabled": true}}
请注意,在实际应用中,我们通常不建议启用 _id 字段的 fielddata 访问,因为它可能会导致性能问题。
给出批量数据,以备后用!
PUT test_index/_bulk
{"index":{"_id":1}}
{"title":"001"}
{"index":{"_id":3}}
{"title":"003"}
{"index":{"_id":5}}
{"title":"005"}
{"index":{"_id":7}}
{"title":"007"}
POST test_index/_search
{
"query": {
"ids": {
"values": [
"3",
"1",
"5",
"7"
]
}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
List ids_list = params.ids;
String cur_id = doc['_id'].value;
for(int i = 0; i < ids_list.length; i++)
{
if(cur_id.equals(ids_list[i]))
{
return i;
}
}
return -1;
""",
"params": {
"ids": ["3","1","5","7"]
}
},
"order": "asc"
}
}
]
}
实现解读:
这个 Elasticsearch 查询用于从名为 test_index 的索引中搜索文档。查询的主要目的是根据给定的 ID 列表检索文档,并按照 ID 列表的顺序对检索到的文档进行排序。
以下是查询的各个部分的详细解释:
通过这个查询,您可以从 test_index 索引中获取指定 ID 的文档,并按照给定的 ID 顺序("3"、"1"、"5"、"7")对结果进行排序。
关于分页,参考普通检索实现即可。
本文结合脚本排序的方式实现了基于用户指定顺序召回结果数据。视频解读如下:
大家有没有更好的实现方式呢?欢迎留言交流。
本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!