こんにちは。カタカナ、ひらがなの区別をしない検索をしたくて、次のようなカスタムアナライザを定義してみました。
elasticsearch/1.7.1 + analysis-kuromoi/2.7.0 の環境です。
Linux + openJDK 1.8.0_25 です。
PUT /test1/_settings?pretty
{
"index": {
"analysis": {
"analyzer": {
"test_hirakana": {
"type": "custom",
"filter": "kana_conv",
"tokenizer": "kuromoji_tokenizer"
}
},
"filter": {
"kana_conv": {
"type": "kuromoji_readingform",
"use_romaji": false
}
}
}
}
}
アナライザを、「ひむろ きょうすけ」でテストしてみます。
GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろ きょうすけ
{
"tokens" : [ {
"token" : "ヒム",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 1
}, {
"token" : "ロ",
"start_offset" : 2,
"end_offset" : 3,
"type" : "word",
"position" : 2
}, {
"token" : "キョウス",
"start_offset" : 4,
"end_offset" : 8,
"type" : "word",
"position" : 3
}, {
"token" : "ケ",
"start_offset" : 8,
"end_offset" : 9,
"type" : "word",
"position" : 4
} ]
}
分割位置はともかく、すべてカタカナになりました(意図通りです)
次に「ひむろきょうすけ」を試しました。
GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろきょうすけ
{
"tokens" : [ {
"token" : "ヒ",
"start_offset" : 0,
"end_offset" : 1,
"type" : "word",
"position" : 1
}, {
"token" : "むろきょうすけ",
"start_offset" : 1,
"end_offset" : 8,
"type" : "word",
"position" : 2
} ]
}
なぜか、「むろきょうすけ」がそのままひらがなで出力されます。
カタカナに変換さえしてくれれば問題ないのですが。
いろいろと試してみたところ、「むろ」で始まる語に分割された場合、readingform フィルタが変換を行なわないらしい事がわかりました。
use_romaji オプションの真偽は、この動作に関係ないようです。
こむろ → 「コム ロ」
ここむろ → 「ココ むろ」
ひむろき → 「ヒ むろき」
GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろき
{
"tokens" : [ {
"token" : "ヒ",
"start_offset" : 0,
"end_offset" : 1,
"type" : "word",
"position" : 1
}, {
"token" : "むろき",
"start_offset" : 1,
"end_offset" : 4,
"type" : "word",
"position" : 2
} ]
}
他にもこのようになるパターンがあるのか見付けてはいないのですが、これは analysis-kuromoji 側の不具合でしょうか。
icu_transform で、"id": "Hiragana-Katakana" のフィルタをかませればひらがなカタカナ変換ができるようですが、kuromoji_readingform だけでどうにかならないものでしょうか。