在Elasticsearch的同义词添加中,出现了一些日语字符引发的非法参数异常问题
首先
我本来想在日语中添加同义词,但是奇怪的是,如果将设置如下所示,当尝试添加像”株式会社”这样的同义词时会出现错误。
无论是”株式会”、”式会社”、”株式”,还是”会社”,都不会出现错误,但是只有”株式会社”会出现错误。
我使用Python进行操作,但我认为在其他环境中也可能会出现类似的情况。
# python辞書(JSONではない。pythonでelasticsearchを利用しているため。)
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"tokenizer": "kuromoji_tokenizer",
"filter": [
"my_synonym"
]
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms": [
'株式会社,アメリカンフットボール'
]
}
}
}
}
}
elasticsearch.exceptions.RequestError: TransportError(400, 'illegal_argument_exception', 'failed to build synonyms')
出现这种错误。
- Elastic 6.2.1 アップグレードkuromoji_synのエラー出ます。 – Elastic In Your Native Tongue / 日本語による質問・議論はこちら – Discuss the Elastic Stack
遭遇了与这种现象相同的情况,那些日语表达不流利的人们。
我在网上查了一下
切词器?过滤器?
- compatibility synonym with other filter ? · Issue #27481 · elastic/elasticsearch
根据这里的说法
这意味着您所有的同义词规则都会使用icu_tokenizer进行分析,并应用以下过滤器。
根据这篇文章所述,特殊字符将由分词器进行处理。
“’% => pour cent’不被接受,因为%被icu_tokenizer移除了,因此无法在通过该分析器的文本中找到它。”
%由于ICU分词器的原因,将消失。
声音过滤器应放在同义词过滤器之后。同义词不应与声音形式进行检查,我们不允许有多个改写规则(比如原始形式 + 声音形式)。
据说过滤器的顺序也很重要。
- think it would be possible to extend the SynonymMap parsing so that it could handle graph tokenstreams, but it wouldn’t be simple.
据这里所说,
除了删除同义词之外,还有其他修复方法吗?
我认为可以通过扩展SynonymMap解析来处理图形token流,但这并不简单。另一个即时的解决方法是看看你是否真的需要在其中使用词边界过滤器。
解决并非简单的事情…如此说来令人烦恼。
其他参考:
– 类似答案:使用文件时出现问题:malformed_input_exception – Elasticsearch – 讨论 Elastic Stack
您是指文字编码吗?
- Synonyms not working with diacritic chars – Elasticsearch – Discuss the Elastic Stack
根据文件载入,并将文件编码设置为utf-8,问题将被解决。
- Synonym ÅÄÖ exception – Elasticsearch – Discuss the Elastic Stack
这也被称为字符编码。
尝试了各种实验
更改分词器
尝试将 tokenizer 设置为 whitespace 或 standard。好像成功地添加了同义词?
然而,关键的同义词却无法正常工作。
对于分词器的定制化
修改Kuromoji分词器的模式。
# python辞書(JSONではない)
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"tokenizer": "ja_tokenizer",
"type": "custom",
"filter": [
"my_synonym"
]
}
},
"tokenizer": {
"ja_tokenizer": {
"type": "kuromoji_tokenizer",
"mode": "normal",
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms": [
'株式会社,アメリカンフットボール'
]
}
}
}
}
}
以这样的方式描述,我成功了。
然而,当我试图在search模式下使用kuromoji_tokenizer时,我不知道该怎么做。
- Elasticsearch 日本語で全文検索 その2 – Hello! Elasticsearch. – Medium
在这个例子中,看起来使用了标准分词器。
可能是因为使用了短语搜索,所以使用标准分词器无法匹配。
- Elasticsearch 2.3でKuromojiとキャッキャウフフしてみる
这里使用了kuromoji_tokenizer,但即使将きゃりーぱみゅぱみゅ的文本输入也没有发生错误,所以是偶然避免了问题?
- ElasticsearchのAnalyzer入門 〜滝沢カレンの謎インスタをヒットさせろ〜 – inFablic | Fablic, inc. Developer’s Blog.
使用的是 kuromoji_tokenizer , 也是在 search 模式下进行的,可能是因为 icu_normalizer 的原因吗?还是只是巧合没有出错而已?
-
- Amazon Elasticsearch Service で類義語(Synonym)を扱う | Developers.IO
- 研究開発:elasticsearchで表記ゆれ対応設定 – livedoor Blog(ブログ)
我觉得这些人只是出了巧合没有出错。
还有一个可能是Analyzer是否由search_analyzer或index_analyzer更改了?
将search和index的分析器分别进行设置。
-
- 【緩訳Elasticsearch】その3 Controlling analysis – DRYな備忘録
- ElasticSearchで禁止ワードチェックしてみた – Qiita
参考にして、私はmappingにsearch_analyzerとanalyzerを指定してみましたが、何の変化もありませんでした。
※途中のバージョンから、index_analyzerはanalyzerとして指定するように変更されたようです。
結果
由于时间关系,尚未完全调查清楚,但似乎在使用kuromoji_tokenizer处理同义词时无法使用search模式。如果是这种情况,是需要停用kuromoji_tokenizer还是将其切换到normal模式呢?
我没有在文件中处理同义词,但也许在那方面可能会解决问题。
此外,如果使用explain等方法来分析分析器的结果更详细,可能还有其他解决方法。
如果还有其他信息,请告诉我。