1

ngramフィルターを使用して単語またはフレーズを実行している場合、元の単語はインデックスに登録されないようです。代わりに、max_gram値までの単語のチャンクのみを取得します。元の単語にもインデックスが付けられると思います。Elasticsearch0.20.5を使用しています。次のようなngramのフィルターを使用してインデックスを設定した場合:

CURL -XPUT 'http://localhost:9200/test/' -d '{
    "settings": {
        "analysis": {
            "filter": {
                "my_ngram": {
                    "max_gram": 10,
                    "min_gram": 1,
                    "type": "nGram"
                },
                "my_stemmer": {
                    "type": "stemmer",
                    "name": "english"
                }
            },
            "analyzer": {
                "default_index": {
                    "filter": [
                        "standard",
                        "lowercase",
                        "asciifolding",
                        "my_ngram",
                        "my_stemmer"
                    ],
                    "type": "custom",
                    "tokenizer": "standard"
                },
                "default_search": {
                    "filter": [
                        "standard",
                        "lowercase"
                    ],
                    "type": "custom",
                    "tokenizer": "standard"
                }
            }
        }
    }
}'

それから私は長い言葉を文書に入れました:

CURL -XPUT 'http://localhost:9200/test/item/1' -d '{
     "foo" : "REALLY_REALLY_LONG_WORD"
 }'

そして、私はその長い単語を検索します:

CURL -XGET 'http://localhost:9200/test/item/_search' -d '{
  "query":
 {
     "match" : {
         "foo" : "REALLY_REALLY_LONG_WORD"
     }
 }
 }'

結果は0です。その単語の10文字のチャンクをクエリすると、結果が得られます。これを実行すると:

curl -XGET 'localhost:9200/test/_analyze?text=REALLY_REALLY_LONG_WORD

私は何トンものグラムを取り戻しますが、元の言葉ではありません。これを希望どおりに機能させるための構成が不足していますか?

4

1 に答える 1

3

フレーズの完全な単語を保持したい場合は、「分析されていない」値を保持する値にマルチフィールドマッピングを使用するか、代わりにキーワードトークンを使用します。

また、nGramトークン化された値を使用してフィールドを検索する場合は、おそらくnGramトークンを使用して検索する必要があります。そうすると、検索フレーズにもn文字の制限が適用され、期待どおりの結果が得られます。

于 2013-03-13T21:07:30.563 に答える