お世話になっております。
フレーズ検索をした際、アナライザーにNGram Tokenizerをセットした場合と、NGram Token Filterをセットした場合で検索結果が異なりました。
NGram Token Filterをセットした場合でも、NGram Tokenizerをセットした場合と同じ検索結果にしたいのですが、どなたか解決策をご存じでしょうか。よろしくお願いいたします。
1.アナライザー設定
{
"analysis": {
"filter": {
"ngram_filter": {
"type": "ngram",
"min_gram": "1",
"max_gram": "2"
},
"normalize": {
"name": "nfkc",
"type": "icu_normalizer"
}
},
"char_filter": {
"whitespace_remove": {
"pattern": "\\s{1,}",
"type": "pattern_replace",
"replacement": ""
}
},
"analyzer": {
"jp_ngram_tokenizer": {
"filter": [ "normalize" ],
"char_filter": [ "whitespace_remove" ],
"type": "custom",
"tokenizer": "ngram_tokenizer"
},
"jp_ngram_filter": {
"filter": [ "normalize", "ngram_filter" ],
"char_filter": [ "whitespace_remove" ],
"type": "custom",
"tokenizer": "whitespace_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": "1",
"max_gram": "2"
},
"whitespace_tokenizer": { "type": "whitespace" }
}
}
2.登録データ
value
日本
本日
日の丸弁当
日本国憲法
3.検索クエリ
(1) NGram Tokenizerの場合
GET index1/_search
{
"from": 0,
"size": 4,
"query": {
"match_phrase": {
"value": {
"query": "日本",
"analyzer": "jp_ngram_tokenizer"
}
}
}
}
(2) NGram Token Filterの場合
GET index1/_search
{
"from": 0,
"size": 4,
"query": {
"match_phrase": {
"value": {
"query": "日本",
"analyzer": "jp_ngram_filter"
}
}
}
}
4.結果
(1) NGram Tokenizerの場合
"hits": {
"total": 2,
"max_score": 0.8027456,
"hits": [
{
"_index": "index1",
"_id": "1",
"_score": 0.8027456,
"_source": {
"value": "日本"
}
},
{
"_index": "index1",
"_id": "4",
"_score": 0.5158902,
"_source": {
"value": "日本国憲法"
}
}
]
}
(2) NGram Token Filterの場合
"hits": {
"total": 4,
"max_score": 0.27233246,
"hits": [
{
"_index": "index1",
"_id": "3",
"_score": 0.27233246,
"_source": {
"value": "日の丸弁当"
}
},
{
"_index": "index1",
"_id": "1",
"_score": 0.21923064,
"_source": {
"value": "日本"
}
},
{
"_index": "index1",
"_id": "2",
"_score": 0.19454905,
"_source": {
"value": "本日"
}
},
{
"_index": "index1",
"_id": "4",
"_score": 0.17135386,
"_source": {
"value": "日本国憲法"
}
}
]
}