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


117

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

SearchParseException:解析失敗[ソートするための[price]のマッピングが見つかりませんでした]

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


1
あなたの質問/答えは私の問題を解決しました-ありがとう。少し一般化するために編集しました。自分に合わない場合は遠慮なくロールバックしてください。
Paul Bellora 2013

1
この問題を処理するためのリファレンスElasticsearch Link
Ajeesh

回答:


116

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

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

詳細については、Elasticsearchのリファレンスをご覧ください。


こんにちは、私は同じ問題を抱えており、これがどのように機能するのか理解できません... missing属性とignore_unmapped属性は一緒に機能するはずですか?たとえば、missingを "_last"に設定し、ignore_unmappedを "false"に設定した場合でも問題は発生しますが、属性がない場合でも、すべてのケースでドキュメントが結果に含まれるようにします。
c4k 2013年

私はこの問題を抱えており、_typeが空の場合(つまり、インデックス付けされたドキュメントがない場合)、「ignore_unmapped」は機能しません。
reinaldoluckman、2015年

7
新しい戦略はunmapped_type
lukmdo '29年

2
私のクエリは、ライブラリなどを更新することなく、今日まで常に機能していましたが、今日、同じエラーが発生し始めました。追加する"ignore_unmapped" : trueと、再び機能し始めましたが、奇妙なことに、舞台裏で何が起こったのでしょうか。知るか!とにかく、それは今動作します。+1
BentCoder 2016年

1
「欠落」と「マッピングなし」の違いを誰かが明確にできますか?特定のフィールドについて、一部のドキュメントには含まれているが、他のドキュメントには含まれていない場合、そのフィールドは「欠落」または「マップ解除」として扱われますか?「欠落」とは、フィールドがドキュメント内にあるが、対応する値がnullであることを意味しますか?
Sher10ck 2018年

43

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


3

どうやらElasticSearchはnull値でソートされません。(SQLの順序付けと同様に)nullを先頭または末尾にあるものとして扱うと想定していましたが、これもこのエラーをトリガーすると考えています。

したがって、このエラーが表示された場合、ElasticSearchに送信するときに、sort属性にデフォルト値があることを確認する必要がある場合があります。

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

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


2

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

ばかげたエラーですが、多分これはここで終わる他の誰かを助けるでしょう。


私は同じ問題を抱えていますが、マップされていないものを無視を指定すると、ルートを検索するときに並べ替えがまったく行われません...インデックスを定義する必要がある場合、これを検索する機能が制限されます...一致する結果が存在する場合はフィールドでソートし、入力しない場合はそのデフォルトを使用します。編集:
mgoetzke

2

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


0

柔軟性を与えるスクリプトを使用することもできます。

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

0

以下のコードを使用すると、added_onは日付で、何が起こりますか!! 属性テキストは分析されます。つまり、保存時に個別の単語に分割され、フィールド内の1つ以上の単語をフリーテキスト検索できます。

したがって、フィールドに関連付けられた「テキスト」と「キーワード」があるため、クエリで集計を使用する必要がある場合は、一般にキーワードのフィールド値が必要です。

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.