エッジNGram tokenizer/filterは役に立ちます。
インデックスのみをインデックスに、search onlyアナライザを使用できます。 インデックス・アナライザは、小文字にしてエッジngramを作成します。検索アナライザにはWord Delimiter filterがあり、クエリの解析に役立ちます。 Wordデリミタフィルタを省略して、空白の代わりにStandard tokenizerを使用するだけで空白とコンマで分割することができます。ワードデリミタを使用すると、トークンを分割する方法をより詳細に制御できます。
いつでも_analyze apiを使用して、トークンの仕組みをテストできます。
インデックスセッティング:
{
"settings" : {
"analysis" : {
"filter": {
"word_delimiter_filter": {
"preserve_original": "true",
"catenate_words": "true",
"catenate_all": "true",
"split_on_case_change": "true",
"type": "word_delimiter",
"catenate_numbers": "true",
"stem_english_possessive": "false"
},
"edgengram_filter": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 3
}
},
"analyzer" : {
"my_edge_ngram_analyzer" : {
"filter": [
"lowercase",
"edgengram_filter"
],
"type": "custom",
"tokenizer" : "whitespace"
},
"my_edge_ngram_search_analyzer": {
"filter": [
"lowercase",
"word_delimiter_filter",
"edgengram_filter"
],
"type": "custom",
"tokenizer": "whitespace"
}
}
}
}
}
マッピング:
{ "index" : { "_index" : "edge_test", "_type" : "test_mapping", "_id" : "1" } }
{ "surname" : "Smith" }
{ "index" : { "_index" : "edge_test", "_type" : "test_mapping", "_id" : "2" } }
{ "surname" : "Rodriguez" }
{ "index" : { "_index" : "edge_test", "_type" : "test_mapping", "_id" : "3" } }
{ "surname" : "Roberts" }
{ "index" : { "_index" : "edge_test", "_type" : "test_mapping", "_id" : "4" } }
{ "surname" : "Doe" }
そして、次の検索テンプレートを使用します:
{
"query" : {
"bool" : {
"should" : [{
"match" : {
"surname_edgengrams" : {
"query" : "Smith, Rodriguez, ROBERTS, doe",
"boost" : 3
}
}
}
]
}
}
}
を
{
"properties": {
"surname_edgengrams": {
"type": "string",
"analyzer": "my_edge_ngram_analyzer",
"search_analyzer": "my_edge_ngram_search_analyzer"
},
"surname": {
"type": "string",
"index": "not_analyzed",
"copy_to": [
"surname_edgengrams"
]
}
}
}
私はバルクAPIを使用して、いくつかの文書をインデックス化
結果:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0.14085768,
"hits": [
{
"_index": "edge_test",
"_type": "test_mapping",
"_id": "1",
"_score": 0.14085768,
"_source": {
"surname": "Smith"
}
},
{
"_index": "edge_test",
"_type": "test_mapping",
"_id": "3",
"_score": 0.14085768,
"_source": {
"surname": "Roberts"
}
},
{
"_index": "edge_test",
"_type": "test_mapping",
"_id": "2",
"_score": 0.13145615,
"_source": {
"surname": "Rodriguez"
}
},
{
"_index": "edge_test",
"_type": "test_mapping",
"_id": "4",
"_score": 0.065728076,
"_source": {
"surname": "Doe"
}
}
]
}
}