0

ElasticSearchを使用しています。このクエリを実行すると、次のようになります。

{query: "blackberry -q10"}

欲しいものが正確に得られます(BlackBerryを参照しているがQ10を参照していないすべての結果)。

ただし、検索するフィールドを「タイトル」フィールドのみに限定したい。たとえば、_sourceドキュメントにはタイトル、本文、タグなどがあり、タイトルのみを検索したいと思います。ElasticSearchの「一致」は私には正しいようです...

{query: {match: {title: "blackberry -q10"}}}

これはタイトルの検索のみに成功しますが、上記の検索とは異なり、タイトルにQ10が含まれる結果を返します。

試合のドキュメントを見ていますが、理解できないようです。

ありがとう!

4

2 に答える 2

1

一致クエリは、そのような否定構文を使用しません。たとえば、用語を否定するために「マイナス」を使用することはできません。デフォルトの検索アナライザーによってハイフンとして解析されます。

この場合、フィルター処理されたクエリを使用します。クエリに否定を追加することもできますが、フィルターの方がはるかに高速です。

{
  "filtered":{
     "query":{
        "match":{
           "title":"blackberry"
        }
     },
     "filter":{
        "bool":{
           "must_not":{
               "term":{
                  "title":"q10"
              }
           }
        }
     }
  }
}

termインデックス作成時にフィールドを分析した方法によっては、フィルターを変更する必要がある場合があることに注意してください。

編集:以下のコメントに基づいて、否定を「インライン」で実行する機能を本当に維持したい場合は、fieldクエリを使用します(より具体的なバージョンのquery_string、も機能します)。このクエリは、インライン否定を可能にするLucene構文を使用します

{
   "field" : {
       "title" : "blackberry -q10"
   }
}

その理由query_stringとその派生物はお勧めできません。足を撃ちやすいからです。むしろ、ユーザーがサーバーを正面から撮影するのは簡単です。Query_stringは適切な構文を要求し、ユーザーがそれを間違って入力すると単に死にます。また、通常はワイルドカードを使用して、ユーザーが恐ろしい非効率的なクエリを実行できるようにします。

于 2013-01-31T15:57:30.203 に答える
0

「ブラックベリー」があり、q10がないすべてのタイトル、「ブラックベリー」がある、またはq10がないすべてのタイトルを一致させたいとします。

一致のデフォルトのブール演算子は(ほとんどの場合)ORです。代わりに、クエリに「operator」:「and」句を追加してみてください。

于 2013-01-31T15:37:06.093 に答える