私は最近、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 フィルターを介して実行されるようにしたいと考えています。