1

Elasticsearch で用語を検索できます ところで、次のように設定をセットアップしました。

.startObject("filter")
    .startObject("lowercase")
         .field("type", "lowercase")
    .endObject()
.endObject()
.startObject("filter")
    .startObject("ngram")
        .field("type", "nGram")
        .field("min_gram", "3")
        .field("max_gram", "10")
    .endObject()
.endObject()

そして、私はこれをこのようにマッピングしようとしました。

builder.startObject().startObject(TYPE_TEST).startObject("properties");
   builder.startObject(title)
            .field("type", "string")
            .field("store", "yes")
            .field("analyzer", "series_analyzer")
            .field("boost", "10")
   .endObject();

そして、このようにフィールド全体で「用語」を検索します。

 curl -XGET localhost:9200/test/_search?q="testte"

「いくつかの部分的な用語」というクエリで結果が見つかりません。

代わりに、このクエリで良い結果を得ることができます

curl -XGET localhost:9200/test/_search?q=title:testte

「タイトル」フィールドのないnGramで用語を検索したいだけです。フィールド全体で用語を検索するにはどうすればよいですか?

私にお知らせください。前もって感謝します

4

1 に答える 1

5

ngram を使用してインデックスを作成したフィールドを検索する場合にのみ、ngram を介して部分一致を取得できます。あなたの場合、それはtitleマッピングで定義されたフィールドです。query_string クエリでフィールドを指定しない場合、デフォルトで、標準のアナライザー_allを使用してインデックス付けされたフィールドが使用されます。クエリで別の既定のフィールドを指定して、用語ごとに指定することを避けることができます。すべてのフィールドに ngram を適用したい場合は、_allフィールドですが、そうすることはお勧めしません。Ngram はインデックスのサイズを大幅に増加させる傾向があるため、どこにも適用しません。また、通常は、各フィールド (またはフィールドのグループ) に異なるテキスト分析を適用することをお勧めします。これは通常、ドメイン駆動型です。

さらに、この_allフィールドは、開始してすべてを検索する場合には非常に便利ですが、すべてのフィールドに同じテキスト分析が適用されるため、本番環境ではこれに頼りたくない場合があります。長期的には無効にすることをお勧めします。

別のヒント:ほとんどの場合に使用するクエリであるmatch queryを見てください。query_string を使用するとより強力になりますが、同時にエラーが発生しやすくなります。query_string のみが提供する機能が必要でない限り、一致クエリを使用します。

于 2013-07-16T08:10:07.023 に答える