0

ショップ名の検索機能を実装したいのですが、「nite out」というショップ名を書いた場合、すべての部分文字列「nite」と「out」と「nite out」も含む結果が必要です。

プレフィックス クエリを使用してみましたが、実行できませんでした。あいまいクエリについて聞いたことがありますが、それで問題が解決するかどうかはわかりません。

「nite out」の一致した結果を上部に取得し、残りの「nite」と「out」の結果を「nite out」の一致した結果の下に取得するには、どの ES クエリを使用すればよいか教えてください。

4

1 に答える 1

2

私はあなたのデータがすでにそのように索引付けされていると仮定niteoutますnite out.

これを行う方法の 1 つは、Match Queryを使用することです。Match クエリは、アナライザーを使用して、fuzziness探しているものを取得します。この特定のケースでは、空白アナライザーを使用して、探している結果を取得できます。クエリを見て、nite outそれを と に分割しniteますout。次に、一致クエリはこれら 2 つのトークンを検索し、関連性に基づいてスコアを付けます。nite out両方として分析された文書は、単独または単独で分析された文書よりも高いスコアを持ちniteます。outniteout

動的マッピングを使用した 3 つのドキュメントの例を次に示します。

ドキュメントにインデックスを付けます:

PUI   {"value":"out"}
PUT   {"value":"nite"}
PUT   {"value":"nite out"}

次に、クエリを作成します。

GET _search
{
   "query": {
      "match": {
         "value": {
            "query": "nite out",
            "analyzer": "whitespace"
         }
      }
   }
}

実際にはここで空白アナライザーを指定する必要はありません。実際には、その行 (および前のコンマ) を完全に削除するだけで済みます。一致クエリは、インデックス時にクエリを実行しているフィールドで使用されるアナライザーに対してクエリ テキストを実行します。この場合、テキストを と に分割するのは標準のアナライザーniteですout

結果:

"hits": [
         {
            "_index": "test",
            "_type": "test",
            "_id": "1",
            "_score": 0.2712221,
            "_source": {
               "value": "nite out"
            }
         },
         {
            "_index": "test",
            "_type": "test",
            "_id": "2",
            "_score": 0.04500804,
            "_source": {
               "value": "nite"
            }
         },
         {
            "_index": "test",
            "_type": "test",
            "_id": "3",
            "_score": 0.04500804,
            "_source": {
               "value": "out"
            }
         }
      ]

このリンクを読んで、elasticsearch のさまざまな検索メカニズムについて学ぶことをお勧めします。

于 2015-08-18T16:36:11.030 に答える