5

「foo bar」などのelasticsearchで特定のフレーズを検索しようとしています。私のクエリは以下のようなものです:

curl -X GET "http://localhost:9200/objects/object/_search" -d '{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "\"foo bar\"",
            "default_field": "_all"
          }
        }
      ]
    }
  }
}'

インデックスに次のような 2 つのオブジェクトがあります。

{
  sub_sections: [
    {
      name: "foo"
    },
    {
      name: "bar"
    }
  ]
}

{
  sub_sections: [
    {
      name: "foo bar"
    }
  ]
}

クエリで二重引用符を使用すると、フレーズに一致する最後のオブジェクトのみが返されることを期待しています。ただし、両方のオブジェクトが常に返されます。auto_generate_phrase_queries++のようなオプションを試しましたが、これまでのところ運がありません。

これは予想される動作ですか?完全に一致するフレーズを含むドキュメントのみを返すにはどうすればよいですか?

4

1 に答える 1

4

デフォルトでは、どちらの例もまったく同じ方法で索引付けされています。同じフィールドの複数のインスタンスが索引付けされる場合、1 つのフィールドの最後の項と次のフィールドの最初の項の間にギャップがなく、順次索引付けされます。これが、フレーズ検索がフィールド インスタンスにまたがる理由です。マッピングをゼロ以外の値に設定position_offset_gapすることで、フィールド間のギャップを増やすことができます。簡単なデモについては、https://gist.github.com/4420794を参照してください。

于 2012-12-31T15:45:20.893 に答える