現在、Symfony2 でFOSElasticaBundleを使用していますが、最長のプレフィックスに一致する検索を作成するのに苦労しています。
これを使用してオートコンプリートのような検索を実行するためにインターネット上にある 100 の例を認識しています。しかし、私の問題は少し異なります。
オートコンプリート タイプの検索では、データベースは最長の英数字文字列 (文字数) を保持し、ユーザーは最短部分のみを提供します。たとえば、ユーザーが「jho」と入力すると、Elasticsearch は「Jhon、Jhonny、Jhonas」を簡単に提供できるとします。
私の問題は逆です。最も長い英数字の文字列を提供したいのですが、Elasticsearch にデータベース内の最大の一致を提供してもらいたいのです。
例: "123456789" を指定すると、データベースは [12,123,14,156,16,7,1234,1,67,8,9,123456,0] を持つことができます。ユーザーが提供した番号は「123456」です。
私は Elasticsearch を使い始めたばかりなので、作業設定などにあまり詳しくありません。
不明な情報や不足している情報がある場合はお知らせください。詳細をお知らせします。
更新 1 (ヴァルの 2 回目の更新を使用)
インデックス: 1800 以上のインデックスをダウンロード
Settings:
curl -XPUT localhost:9200/tests -d '{
"settings": {
"analysis": {
"analyzer": {
"edge_ngram_analyzer": {
"tokenizer": "edge_ngram_tokenizer",
"filter": [ "lowercase" ]
}
},
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edgeNGram",
"min_gram": "2",
"max_gram": "25"
}
}
}
},
"mappings": {
"test": {
"properties": {
"my_string": {
"type": "string",
"fields": {
"prefix": {
"type": "string",
"analyzer": "edge_ngram_analyzer"
}
}
}
}
}
}
}'
Query:
curl -XPOST localhost:9200/tests/test/_search?pretty=true -d '{
"size": 1,
"sort": {
"_script": {
"script": "doc.my_string.value.length()",
"type": "number",
"order": "desc"
},
"_score": "desc"
},
"query": {
"filtered": {
"query": {
"match": {
"my_string.prefix": "8092232423"
}
},
"filter": {
"script": {
"script": "doc.my_string.value.length() <= maxlength",
"params": {
"maxlength": 10
}
}
}
}
}
}'
With this configuration the query returns the following results:
{
"took" : 61,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1754,
"max_score" : null,
"hits" : [ {
"_index" : "tests",
"_type" : "test",
"_id" : "AU8LqQo4FbTZPxBtq3-Q",
"_score" : 0.13441172,
"_source":{"my_string":"80928870"},
"sort" : [ 8.0, 0.13441172 ]
} ]
}
}
ボーナス質問
その検索に数値の配列を提供し、毎回クエリを実行することなく効率的な方法でそれぞれに一致するプレフィックスを取得したいと思います