Elasticsearchは、SearchParseException
ソート基準で使用されるフィールドを含まないドキュメントが見つかった場合、クエリの解析中にwhileをスローします。
SearchParseException:解析失敗[ソートするための[price]のマッピングが見つかりませんでした]
一部のprice
フィールドが欠落している場合でも、これらのドキュメントを正常に検索するにはどうすればよいですか?
Elasticsearchは、SearchParseException
ソート基準で使用されるフィールドを含まないドキュメントが見つかった場合、クエリの解析中にwhileをスローします。
SearchParseException:解析失敗[ソートするための[price]のマッピングが見つかりませんでした]
一部のprice
フィールドが欠落している場合でも、これらのドキュメントを正常に検索するにはどうすればよいですか?
回答:
さらに掘り下げた後、私は以下のような解決策を見つけました。sort句でignore_unmapped
明示的に設定する必要がtrue
あります。
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
詳細については、Elasticsearchのリファレンスをご覧ください。
"ignore_unmapped" : true
と、再び機能し始めましたが、奇妙なことに、舞台裏で何が起こったのでしょうか。知るか!とにかく、それは今動作します。+1
両方の例をお探しの方は、こちらの私の回答
ignore_unmapped
をunmapped_type
ご覧ください。
「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値でソートされません。(SQLの順序付けと同様に)nullを先頭または末尾にあるものとして扱うと想定していましたが、これもこのエラーをトリガーすると考えています。
したがって、このエラーが表示された場合、ElasticSearchに送信するときに、sort属性にデフォルト値があることを確認する必要がある場合があります。
ソート列にデフォルト値がないため、ESにnullとして送信されていたため、Rails + ElasticSearch + Tireでこのエラーが発生しました。
この問題はnull値が処理されていることを示していますが、これは私の経験ではありませんでした。とにかく試す価値のあるものです。
私は同じ問題を経験しましたが(ソート;いくつかのエラーが発生しますが、いくつかの結果が発生します)、私の場合、ルートで検索が発行され(インデックスが指定されていません)、取得したエラーは検索/順序も原因でしたKibanaインデックスを探します。
ばかげたエラーですが、多分これはここで終わる他の誰かを助けるでしょう。
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" }
}
]
}
以下のコードを使用すると、added_onは日付で、何が起こりますか!! 属性テキストは分析されます。つまり、保存時に個別の単語に分割され、フィールド内の1つ以上の単語をフリーテキスト検索できます。
したがって、フィールドに関連付けられた「テキスト」と「キーワード」があるため、クエリで集計を使用する必要がある場合は、一般にキーワードのフィールド値が必要です。
BEFORE
"_source":{....}
"query" : {...}
"sort": [
{
"added_on": {
"order": "desc"
}
}
]
AFTER
"_source":{....}
"query" : {...}
"sort": [
{
"added_on.keyword": {
"order": "desc"
}
}
]