14

以下の構文を使用して検索結果を取得することに成功しましたが、ブール条件を追加するのに問題があります。

http://localhost:9200/index_name/type_name/_search?q=test

私のドキュメントは次のようになります。

{
    "isbn":"9780307414922",
    "name":"Dark of the Night",
    "adult":false
}

これが私がやろうとしていることを達成する方法についての私の最善の推測です。

{
    "query_string": {
        "default_field": "_all",
         "query": "test"
    },
    "from": 0,
    "size": 20,
    "terms": {
        "adult": true
    }
}

ただし、これにより「解析の失敗[要素[query_string]]]のパーサーがありません;}]」になります。

ElasticSearch0.20.5を使用しています。

「?q = test」のように検索語を含むドキュメントを照合し、ドキュメントのアダルトプロパティでフィルタリングするにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

12

adult == true句はの一部である必要があります-句をトップレベルのパラメータとしてにquery渡すことはできません。termsearch

したがって、クエリ句としてクエリに追加できます。その場合bool、次のように、クエリを使用して両方のクエリ句を結合する必要があります。

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "must" : [
            {
               "query_string" : {
                  "query" : "test"
               }
            },
            {
               "term" : {
                  "adult" : true
               }
            }
         ]
      }
   },
   "from" : 0,
   "size" : 20
}
'

ただし、実際には、クエリ句は次の目的で使用する必要があります。

  • 全文検索
  • 関連性スコアに影響を与える条項

ただし、あなたのadult == true条項は関連性を変更するために使用されておらず、全文検索は含まれていません。これは、はい/いいえの応答です。言い換えると、フィルター句として適用する方が適切です。

これは、クエリとフィルターの両方を受け入れるクエリ句でフルテキストクエリ(を_all含む)をラップする必要があることを意味します。testfiltered

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "term" : {
               "adult" : true
            }
         },
         "query" : {
            "query_string" : {
               "query" : "test"
            }
         }
      }
   },
   "from" : 0,
   "size" : 20
}
'

フィルタは通常、次の理由で高速です。

  • ドキュメントにスコアを付ける必要はありません。ドキュメントを含めるか除外するだけです。
  • キャッシュして再利用できます
于 2013-03-20T15:46:47.620 に答える