Elasticsearchは、並べ替え条件で使用されるフィールドを含まないドキュメントが見つかった場合、クエリの解析中にSearchParseException
をスローします。
SearchParseException:解析エラー[ソートするための[価格]のマッピングが見つかりません]
一部のprice
フィールドが欠落している場合でも、これらのドキュメントを正常に検索するにはどうすればよいですか?
さらに掘り下げた後、次のような解決策を見つけました。 ignore_unmapped
は、sort節でtrue
に明示的に設定する必要があります。
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
詳細については、以下のElasticsearchリファレンスを参照してください。
ignore_unmapped
とunmapped_type
の両方の例をお探しの方は、 my response here をご覧ください。
「ignore_unmapped」は廃止され、「unmapped_type」が優先されることに注意してください。これは #7039 の一部として行われました
ドキュメントから: 1.4.0より前は、ignore_unmappedブールパラメータがありました。これは、出力するソート値を決定するのに十分な情報ではなく、クロスインデックス検索では機能しませんでした。引き続きサポートされますが、代わりに新しいunmapped_typeに移行することをお勧めします。
デフォルトでは、フィールドに関連付けられたマッピングがない場合、検索リクエストは失敗します。 unmapped_typeオプションを使用すると、マッピングがなく、ソートされないフィールドを無視できます。このパラメーターの値は、発行するソート値を決定するために使用されます。使用方法の例を次に示します。
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
クエリ対象のインデックスのいずれかに価格のマッピングがない場合、Elasticsearchはlong型のマッピングがあるかのように処理します。このインデックスのすべてのドキュメントにはこのフィールドの値がありません。
どうやらElasticSearchはnull値でソートしません。 nullを(SQLの順序付けのように)開始または終了として扱うと想定していましたが、このエラーもトリガーすると考えています。
そのため、このエラーが表示される場合、ElasticSearchに送信されるときに、並べ替え属性にデフォルト値があることを確認する必要があります。
Rails + ElasticSearch + Tireでこのエラーが発生したのは、ソート列にデフォルト値がないため、ESにnullとして送信されていたためです。
この問題 はnull値が処理されていることを示しますが、私の経験ではありません。とにかく試してみる価値があります。
Elasticsearch 6.4
インデックスを指定するだけで、それがKibanaにあります
前
GET /_search
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
後
GET /document-index/contact/_search (here)
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
私は同じ問題を経験しました(ソート;いくつかのエラーが発生しますが、結果がいくつかあります)が、私の場合、検索はルートで発行されていて(インデックスが指定されていません)、取得したエラーは検索/順序もあったためでしたKibanaインデックスを探しています。
愚かなエラーですが、これはここで終わる誰かを助けるかもしれません。
また、ある程度の柔軟性を提供するスクリプトを使用することもできます。
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "return !doc['price'].empty ? doc['price'].value : 0"
},
"order" : "desc"
}
}
eS 6.7を使用している場合
これを試して
sort : ["title.keyword:desc"]