gpt4 book ai didi

sorting - 是否可以在 Elasticsearch 中按范围排序?

转载 作者:行者123 更新时间:2023-11-29 02:46:09 25 4
gpt4 key购买 nike

当我执行以下查询时:

{
"query": {
"bool": {
"filter": [
{
"match": {
"my_value": "hi"
}
},
{
"range": {
"my_range": {
"gt": 0,
"lte": 200
}
}
}
]
}
},
"sort": {
"my_range": {
"order": "asc",
"mode": "min"
}
}
}

我得到错误:

"caused_by": {
"type": "illegal_argument_exception",
"reason": "Fielddata is not supported on field [my_range] of type [long_range]"
}

如何使 range 数据类型可排序?这可能吗?

Elasticsearch 版本:5.4,但我想知道这是否适用于任何版本。

更多上下文

并非所有别名/索引中的文档都有范围字段。但是,查询过滤器仅包含具有该字段的文档。

最佳答案

使用范围数据类型的字段进行排序并不直接。你仍然可以使用 script based sorting一定程度上达到预期的效果。

例如为了脚本的简单性,我假设您的所有文档的数据都是针对 my_range 编制索引的字段有 gt 的数据和 lte只有并且您想根据两者的最小值进行排序,那么您可以添加以下内容进行排序:

{
"query": {
"bool": {
"filter": [
{
"match": {
"my_value": "hi"
}
},
{
"range": {
"my_range": {
"gt": 0,
"lte": 200
}
}
}
]
}
},
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"inline": "Math.min(params['_source']['my_range']['gt'], params['_source']['my_range']['lte'])"
},
"order": "asc"
}
}
}

对于涉及所有 lt 组合的复杂数据,您可以根据需要修改脚本, gt , lte , gte .

更新(其他不同用例的脚本):

<强>1。按差异排序
"Math.abs(params['_source']['my_range']['gt'] - params['_source']['my_range']['lte'])"
<强>2。排序方式 gt
"params['_source']['my_range']['gt']"
<强>3。排序方式 lte
"params['_source']['my_range']['lte']"
<强>4。如果查询返回几个没有 range 的文档,则排序字段
"if(params['_source']['my_range'] != null) { <sorting logic> } else { return 0; }"

替换<sorting logic>具有所需的排序逻辑(可以是上述 3 种之一或查询中的一种)

return 0可以替换为return -1或根据排序需要的任何其他数字

关于sorting - 是否可以在 Elasticsearch 中按范围排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com