0

こんにちは、Elastic Search を使用してミニ アプリケーションを開発しています。

設定:-

        settingBuilder = XContentFactory.jsonBuilder().startObject()
                .startObject("index")
                .startObject("analysis")
                .startObject("analyzer")
                .startObject("custom_analyzer")
                .field("type", "custom")
                .field("tokenizer","keyword")
                .field("filter", new String[]{"standard","ngram_filters"})
                .endObject()
                .endObject()
                .startObject("filter")
                .startObject("ngram_filters")
                .field("type", "nGram")
                .field("min_gram", "1")
                .field("max_gram","10")
                .endObject()
                .endObject()
                .endObject()
                .endObject()
                .endObject();

マッピング :-

        contentBuilder = XContentFactory.jsonBuilder().startObject()
        .startObject("students")
        .startObject("properties")
        .startObject("searchColumn")
        .field("analyzer", "custom_analyzer")
        .field("type", "string")
        .endObject()
        .startObject("firstName")
        .field("type","string")
        .field("analyzer", "custom_analyzer")
        .field("store", "yes")
        .endObject()
        .startObject("lastName")
        .field("type","string")
        .field("analyzer", "custom_analyzer")
        .field("store", "yes")
        .endObject()
        .startObject("registerNumber")
        .field("type", "long")
        .field("analyzer", "custom_analyzer")
        .field("store", "yes")
        .endObject()
        .endObject()
        .endObject()
        .endObject();

ここでは nGram フィルターを指定しました。しかし、何らかの理由で検索プロセスを実行しているときに、prefixFilter または prefixQuery にアナライザーを適用したくありません。オプションはありますか。私がここで直面している問題は、

たとえば。

    apple
    one apple
    two apple 

それらが例の firstName 値であると仮定します。文字「a」をプレフィックスとして検索すると、「apple」ドキュメントのみを取得する必要があります。しかし、現在、nGramのおかげですべての結果を取得しています...これに対する解決策を教えてください。

4

1 に答える 1

1

文字列フィールドのマッピングを定義すると、プロパティindex_analyzerとプロパティを使用するだけで、インデックス時とクエリ時に適用されるさまざまなアナライザーを定義できますsearch_analyzeranalyzer現在、インデックスとクエリの両方で同じアナライザーを適用するためのショートカットであるプロパティを使用しています。実際、通常、インデックス時とクエリ時に適用される、同等ではないにしても同様のテキスト分析チェーンがありますが、クエリから ngram を作成したくないため、ngram は間違いなく例外です。

2 つの異なるアナライザーを定義するだけです。1 つは ngram を作成し、もう 1 つは作成しません。次のようにマッピングを更新します。

.startObject("firstName")
.field("type","string")
.field("index_analyzer", "ngrams_analyzer")
.field("search_analyzer", "search_analyzer_without_ngrams")
于 2013-07-23T21:58:13.630 に答える