我试图通过一组嵌套的键值对在ElasticSearch 5中对搜索结果进行排序。即:
我有以下结果(伪结构,为了保持简单):
{
"hit1": {
"nested_objects": [
{
"Key": "abc",
"Value": 0.1
},
{
"Key": "def",
"Value": 0.3
}
]
},
"hit2": {
"nested_objects": [
{
"Key": "abc",
"Value": 0.9
},
{
"Key": "def",
"Value": 0.1
}
]
}
}
我喜欢用"最高值排序,其中Key =' abc'",这意味着" hit2"会出来的。
我的映射如下:
{
"test_index": {
"mappings": {
"test_type": {
"properties": {
"nested_objects": {
"type": "nested",
"properties": {
"Key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Value": {
"type": "float"
}
}
}
}
}
}
}
}
我试图遵循以下建议:
Sort elastic search query based on a nested key value array
Sort nested object in Elasticsearch
...但我一直收到以下错误:
"Fielddata is disabled on text fields by default"
再现此次的排序尝试示例:
{
"sort": [
{
"nested_objects.Key": {
"order": "desc",
"nested_path": "nested_objects",
"nested_filter": {
"term": { "nested_objects.Key": "abc" }
}
}
}
]
}
解决此问题的最佳做法是什么?启用现场数据(使用大量ram)真的是这里唯一的选择吗?
答案 0 :(得分:1)
分析Text
数据类型(此类型用于全文搜索)。
对分析的字段进行排序很昂贵,这就是默认情况下禁用它的原因
通常您不需要按分析字段进行排序,因此请尝试对关键字字段进行排序:
"term": { "nested_objects.Key.keyword": "abc" }
阅读this doc以更深入地了解问题。
答案 1 :(得分:1)
在您的示例中,您按键排序,但您说您想按值排序。密钥默认情况下不可排序(正如Taras指出的那样,您必须使用“.keyword”对该字段进行排序),这会引发您遇到的错误。
要完全解决您的问题,请按值排序并按键过滤。你已经按Key过滤了(你不需要使用“.keyword”这样做),所以你所要做的就是按值排序:
{
"sort": [
{
"nested_objects.Value": { <-- SOLUTION
"order": "desc",
"nested_path": "nested_objects",
"nested_filter": {
"term": { "nested_objects.Key": "abc" }
}
}
}
]
}