Edge NGram Token Filterを使用しています。検索にてHITした箇所にhighlightをつけたいのですが、想定した箇所とは異なる部分がhighlightされており、どうすればよいのか、アドバイスをいただければ幸いです。
Elasticsearch 6.3.0
●インデックスのmapping
PUT /my_index
{
"settings" : {
"index": {
"analysis": {
"filter":{
"edgeNGramFilter":{
"type" : "edgeNGram",
"max_gram" : 50
}
},
"analyzer": {
"jp_analyzer": {
"tokenizer": "kuromoji_tokenizer",
"filter": [
"kuromoji_stemmer",
"edgeNGramFilter"
]
},
"jp_search_analyzer": {
"tokenizer": "kuromoji_tokenizer",
"filter": [
"kuromoji_stemmer"
]
}
}
}
}
},
"mappings" : {
"my_type" : {
"properties" : {
"code" : {
"type" : "keyword"
},
"contents" : {
"type" : "text",
"analyzer" : "jp_analyzer",
"search_analyzer" : "jp_search_analyzer"
}
}
}
}
}
●ドキュメント
POST _bulk
{ "index" : { "_index" : "my_index", "_type" : "my_type", "_id" : "1" } }
{ "contents": "本日は晴天なり。お隣の花壇に、秋桜の花が咲き乱れる。", "code": "1-1" }
●クエリ
GET my_index/_search
{
"_source": false,
"query": {
"match": {
"contents": "秋"
}
},
"highlight": {
"fields": {
"contents" : {}
}
}
}
●結果
{
"took": 17,
"timed_out": false,
"_shards": {
・・・
},
"hits": {
"total": 1,
"max_score": 0.73617005,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.34992102,
"highlight": {
"contents": [
"お隣の花壇に、<em>秋桜</em>の花が咲き乱れる。"
]
}
}
]
}
}
結果として
"お隣の花壇に、<em>秋桜</em>の花が咲き乱れる。"
となりますが、検索したワードが「秋」の為
"お隣の花壇に、<em>秋</em>桜の花が咲き乱れる。"
となるのが理想です。
tokenizerの結果としての「秋桜」がhighlightされているのであろう、という事象は理解できるのですが、ではどうすれば「秋」だけがhighlightされるのかが判りません。
調べてみたところ、Token FilterではなくTokenizerでEdge NGram を使用すればうまくいく、ということがわかりましたが、対象とする文字列が日本語の文章であるため、Tokenizerはkuromojiでないと単語の区切りができないのでは?と考えております。
前方一致検索をしたい為、Edge NGramを使用しておりますが、Edge NGramにこだわってはおりません。(ただ、Edge NGramを使用せずにPrefix Queryも試してみましたが、結果は同じでした。)
どうぞよろしくお願いいたします。