2017-10-04 17 views
0

ElasticSearch 5でネストされたキー値の組で検索結果をソートしようとしています。すなわち:ElasticSearch 5:ネストされたキーと値でソートすると、デフォルトでテキストフィールドでフィールドデータが無効になります。

私は次のような結果(それをシンプルに保つために擬似構造、)持っている:私は「最高値キー= 『ABC』でソートすることがしたいと思います

{ 
    "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 
     } 
    ] 
    } 
} 

をこれは "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を使用する)を有効にしていますか?

答えて

1

例では、Keyでソートしていますが、Valueでソートするとします。キーはデフォルトでソートできません(Tarasが指摘するように、 ".keyword"を使用してフィールドをソートする必要があります)。これにより、発生したエラーがスローされます。

問題を完全に解決するには、値で並べ替えてキーでフィルタします。あなたは既にKeyでフィルタリングしています(これを行うには ".keyword"を使う必要はありません)。値で並べ替えるだけです。値:

{ 
    "sort": [ 
    { 
     "nested_objects.Value": { <-- SOLUTION 
     "order": "desc", 
     "nested_path": "nested_objects", 
     "nested_filter": { 
      "term": { "nested_objects.Key": "abc" } 
     } 
     } 
    } 
    ] 
} 
1

Textデータ型が解析されます(このタイプはフルテキスト検索に使用されます)。 分析フィールドのソートはコストがかかるため、デフォルトでは無効になっています。
は、通常は、分析フィールドでソートする必要があるので、代わりにキーワードフィールド上のソートしようとしないでください:

"term": { "nested_objects.Key.keyword": "abc" } 

読むthisドキュメントをより深く問題を理解します。

+0

ありがとうTaras問題の半分(フィールド・データ・エラー)を解決します。私はまだ "abc"の値で並べ替える必要があります - '" term ":{" nested_objects.Key.keyword ":" abc "}'? – Scarabas

関連する問題