web-dev-qa-db-ja.com

ElasticSearchでソートするためのフィールドのマッピングが見つかりません

Elasticsearchは、並べ替え条件で使用されるフィールドを含まないドキュメントが見つかった場合、クエリの解析中にSearchParseExceptionをスローします。

SearchParseException:解析エラー[ソートするための[価格]のマッピングが見つかりません]

一部のpriceフィールドが欠落している場合でも、これらのドキュメントを正常に検索するにはどうすればよいですか?

99
Yadu

さらに掘り下げた後、次のような解決策を見つけました。 ignore_unmappedは、sort節でtrueに明示的に設定する必要があります。

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

詳細については、以下のElasticsearchリファレンスを参照してください。

103
Yadu

ignore_unmappedunmapped_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型のマッピングがあるかのように処理します。このインデックスのすべてのドキュメントにはこのフィールドの値がありません。

37
Navneet Kumar

どうやらElasticSearchはnull値でソートしません。 nullを(SQLの順序付けのように)開始または終了として扱うと想定していましたが、このエラーもトリガーすると考えています。

そのため、このエラーが表示される場合、ElasticSearchに送信されるときに、並べ替え属性にデフォルト値があることを確認する必要があります。

Rails + ElasticSearch + Tireでこのエラーが発生したのは、ソート列にデフォルト値がないため、ESにnullとして送信されていたためです。

この問題 はnull値が処理されていることを示しますが、私の経験ではありません。とにかく試してみる価値があります。

3
mahemoff

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" }
    }
  ]
}
2
Brian Sanchez

私は同じ問題を経験しました(ソート;いくつかのエラーが発生しますが、結果がいくつかあります)が、私の場合、検索はルートで発行されていて(インデックスが指定されていません)、取得したエラーは検索/順序もあったためでしたKibanaインデックスを探しています。

愚かなエラーですが、これはここで終わる誰かを助けるかもしれません。

2
James Boutcher

また、ある程度の柔軟性を提供するスクリプトを使用することもできます。

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}
0
Rafal Enden

eS 6.7を使用している場合

これを試して

sort : ["title.keyword:desc"]
0
Khalid Skiod