0

私は最近、elasticsearch クエリにワイルドカードを使用してはならないことに気付きました。代わりに、ngram を使用するように言われました。私の実験では、これは非常にうまく機能しました。私がやりたいことは、すべてのマップされたフィールド (または特定のパターンに適合するマップされたプロパティ) に ngrams を使用するよう Elasticsearch に指示できるようにすることです。例えば:

CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{
     "mappings": {
         "person": {
             "properties": {
                 "name": {
                     "type": "string",
                     "analyzer": "partial"
                 }
             }
         }
     },
     "settings": {
         "analysis": {
             "filter": {
                 "lb_ngram": {
                     "max_gram": 10,
                     "min_gram": 1,
                     "type": "nGram"
                 }
             },
             "analyzer": {
                 "partial": {
                     "filter": [
                         "standard",
                         "lowercase",
                         "asciifolding",
                         "lb_ngram"
                     ],
                     "type": "custom",
                     "tokenizer": "standard"
                 }
             }
         }
     }
 }'

さて、このマッピングを追加すると:

CURL -XPUT 'http://localhost:9200/test-ngram-7/person/1' -d '{
 "name" : "Cobb",
 "age" : 31
 }'

「obb」を簡単にクエリして、部分的な結果を取得できます。私のアプリでは、人々がどのフィールドをマッピングするのかを事前に知りません。もちろん、クライアント側でこれを短絡して、ドキュメントを投稿する前にマッピングを宣言することもできますが、次のようなことができれば非常にクールです。

CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{
     "mappings": {
         "person": {
             "properties": {
                 "_default_": {
                     "type": "string",
                     "analyzer": "partial"
                 }
             }
         }
     },
     "settings": {
         "analysis": {
             "filter": {
                 "lb_ngram": {
                     "max_gram": 10,
                     "min_gram": 1,
                     "type": "nGram"
                 }
             },
             "analyzer": {
                 "partial": {
                     "filter": [
                         "standard",
                         "lowercase",
                         "asciifolding",
                         "lb_ngram"
                     ],
                     "type": "custom",
                     "tokenizer": "standard"
                 }
             }
         }
     }
 }'

「デフォルト」を使用していることに注意してください。また、「name.*」のようにできれば、name で始まるすべてのプロパティがこの方法でフィルター処理されると便利です。私はelasticsearchがデフォルトとワイルドカードをサポートしていることを知っているので、間違っていることを願っています。

つまり、マッピング API を使用せずに、マッピングが自動的に作成されるときに、新しいプロパティが ngram フィルターを介して実行されるようにしたいと考えています。

4

2 に答える 2

0

だから、私が見つけた1つの解決策は、「デフォルト」アナライザーをセットアップすることです。ドキュメントによると

デフォルトのアナライザー アナライザーは論理名で登録されます。その後、マッピング定義または特定の API から参照できます。何も定義されていない場合は、デフォルトが使用されます。何も導出できない場合にデフォルトで使用されるアナライザーを定義するオプションがあります。

デフォルトの論理名を使用すると、インデックス作成と API の検索の両方に使用されるアナライザーを構成できます。default_index 論理名を使用して、インデックス作成時にのみ使用される既定のアナライザーを構成できます。また、default_search を使用して、検索時にのみ使用される既定のアナライザーを構成できます。

次に例を示します。

CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{

     "settings": {
         "analysis": {
             "filter": {
                 "lb_ngram": {
                     "max_gram": 10,
                     "min_gram": 1,
                     "type": "nGram"
                 }
             },
             "analyzer": {
                 "default": {
                     "filter": [
                         "standard",
                         "lowercase",
                         "asciifolding",
                         "lb_ngram"
                     ],
                     "type": "custom",
                     "tokenizer": "standard"
                 }
             }
         }
     }
 }'

そして、次のクエリが機能します。

CURL -XGET 'http://localhost:9200/test-ngram-7/person/_search' -d '{
  "query":
 {
     "match" : {
         "name" : "obb"
     }
 }
 }'

これがこれを行う「正しい」方法であるかどうかにまだ興味があるため、自分の質問に答えます。

于 2013-03-12T03:29:09.363 に答える