お使いになられているelasticsearchのバージョンはどれでしょう?
こちらで試した限りですと、5.1.1でkuromojiを設定したフィールドに"私は一眼レフカメラが欲しい"という語を入れて見たところ、
「一眼」が「一」と「眼」に分かれないのです。
mappingの設定や、どのようなクエリをelasticsearchに発行したのかがわかると良いのですが・・・。
なお、検索の精度を上げるアプローチの仕方が参考になるかもしれません。
以下、長くなりますがこちらで確認した内容です。
- 事前準備
indexの作成。 kuromoji_tokenizerのmodeごとの差異があるかどうかを確認するため、3つAnalyzerを作りました。
- ja-normal-analyzer
- ja-search-analyzer
- ja-extended-analyzer
PUT kuromoji-test
{
"template": "kuromoji-test",
"settings": {
"analysis": {
"analyzer": {
"ja-normal-analyzer": {
"type": "custom",
"tokenizer": "ja-normal-tokenizer"
},
"ja-search-analyzer": {
"type": "custom",
"tokenizer": "ja-search-tokenizer"
},
"ja-extended-analyzer": {
"type": "custom",
"tokenizer": "ja-extended-tokenizer"
}
},
"tokenizer": {
"ja-normal-tokenizer": {
"type": "kuromoji_tokenizer",
"mode": "normal"
},
"ja-search-tokenizer": {
"type": "kuromoji_tokenizer",
"mode": "search"
},
"ja-extended-tokenizer": {
"type": "kuromoji_tokenizer",
"mode": "extended"
}
}
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"test": {
"match": "message",
"mapping": {
"type": "text",
"fields": {
"normal": {
"type": "text",
"analyzer": "ja-normal-analyzer",
"term_vector": "with_positions_offsets",
"store": true
},
"search": {
"type": "text",
"analyzer": "ja-search-analyzer",
"term_vector": "with_positions_offsets",
"store": true
},
"extended": {
"type": "text",
"analyzer": "ja-extended-analyzer",
"term_vector": "with_positions_offsets",
"store": true
}
}
}
}
}
]
}
}
}
2.Analyze APIによる分割の確認
POST kuromoji-test/_analyze
{
"analyzer": "ja-normal-analyzer",
"text" : "私は一眼レフカメラが欲しい"
}
normal, search, extendedのいずれで行っても 一眼は1つのトークンになりました。
これはnormalの結果です。
{
"tokens": [
{
"token": "一眼",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 0
},
{
"token": "レフ",
"start_offset": 2,
"end_offset": 4,
"type": "word",
"position": 1
},
{
"token": "カメラ",
"start_offset": 4,
"end_offset": 7,
"type": "word",
"position": 2
},
{
"token": "が",
"start_offset": 7,
"end_offset": 8,
"type": "word",
"position": 3
},
{
"token": "欲しい",
"start_offset": 8,
"end_offset": 11,
"type": "word",
"position": 4
}
]
}
3.検索実行による確認
結果が取得できて、またハイライトも行われることを確認しました。(ちゃんと タグの中に一眼が入っている)
PUT kuromoji-test/test/1
{
"message" : "私は一眼レフカメラが欲しい"
}
GET kuromoji-test/_search
{
"query": {
"match_phrase": {
"message.normal": "一眼"
}
},
"highlight": {
"require_field_match": false,
"fields": {
"message.normal" : {},
"message.search" : {},
"message.extended" : {}
}
}
}
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.28582606,
"hits": [
{
"_index": "kuromoji-test",
"_type": "test",
"_id": "1",
"_score": 0.28582606,
"_source": {
"message": "私は一眼レフカメラが欲しい"
},
"highlight": {
"message.search": [
"私は<em>一眼</em>レフカメラが欲しい"
],
"message.extended": [
"私は<em>一眼</em>レフカメラが欲しい"
],
"message.normal": [
"私は<em>一眼</em>レフカメラが欲しい"
]
}
}
]
}
}