問題發(fā)現(xiàn)
最近在給es插入文檔的時候,忽然報(bào)錯裹粤,提示如下:
ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=startOffset must be non-negative, and endOffset must be >= startOffset, and offsets must not go backwards startOffset=0,endOffset=3,lastStartOffset=3 for field 'title.pinyin']]
感覺是在用ik拼音分詞的時候報(bào)的錯终蒂。
排查過程
并不是所有的文檔在插入的時候會報(bào)錯,只有在title字段包含特殊符號的時候會報(bào)錯遥诉,上網(wǎng)查了一下原因拇泣,說是ik拼音插件的錯誤,只需要升級一下插件的版本即可矮锈。
然而因?yàn)橛玫氖前⒗镌频膃s服務(wù)霉翔,不能對插件進(jìn)行升級,所以這個方法行不通愕难。
也有說是因?yàn)椋瑢?shù)“ignore_pinyin_offset”設(shè)置為false后,并向pinyin分詞字段批量寫入數(shù)據(jù)猫缭,即會出現(xiàn)“startOffset must be non-negative, and endOffset must be >= startOffset, and offsets must not go backwards”異常葱弟。所以將ignore_pinyin_offset設(shè)為true即可。
設(shè)置前的配置:
"my_pinyin": {
?? "keep_first_letter": "false",
?? "ignore_pinyin_offset": "false",
?? "keep_joined_full_pinyin": "true",
?? "lowercase": "true", "padding_char": " ",
?? "first_letter": "prefix",
?? "keep_original": "true",
?? "remove_duplicated_term": "true",
?? "keep_separate_first_letter": "false",
?? "type": "pinyin", "keep_full_pinyin": "false"
}
設(shè)置后的配置:
"my_pinyin": {
? "keep_first_letter": "false",
? "ignore_pinyin_offset": "true",
? "keep_joined_full_pinyin": "true",
? "lowercase": "true",
? "padding_char": " ",
? "first_letter": "prefix",
? "keep_original": "true",
? "remove_duplicated_term": "true",
? "keep_separate_first_letter": "false",
? "type": "pinyin",
? "keep_full_pinyin": "false"
}
改完之后重新索引一遍文件猜丹,結(jié)果還是報(bào)這個錯芝加。
問題解決
就這么折騰了兩天之后,發(fā)現(xiàn)既然這是這個版本的本身的bug射窒,然后阿里云那邊又不給升級版本藏杖,那為什么不曲線救國呢?
前面一開始排查的時候發(fā)現(xiàn)脉顿,是標(biāo)題含有特殊符號的時候蝌麸,才會出現(xiàn)這個bug,那么可以在拼音分詞之前艾疟,再加一個filter来吩,把特殊符號過濾掉,自然就沒問題了蔽莱。
于是我先配置了一個filter:
"specialCharactersFilter":?{
? "pattern":?"\\p{Punct}",
? "type":?"pattern_replace",
? "replacement":?""
}
然后再把這個filter配置到analyzer里:
"ik_pinyin_analyzer": {
? "filter": [
??? "specialCharactersFilter",
??? "my_pinyin"
? ],
? "type": "custom",
? "tokenizer": "ik_smart"
}
這樣弟疆,在用ik_pinyin_analyzer分詞之前,會先通過specialCharactersFilter的正則表達(dá)式過濾盗冷,把所有的特殊符號都過濾掉怠苔,然后再用my_pinyin進(jìn)行拼音分詞。
這么處理后仪糖,就不會出現(xiàn)上面出現(xiàn)的錯誤了柑司。
注:上述配置都是個性化配置,得根據(jù)自己的習(xí)慣和要求來配置乓诽,不用照搬帜羊,只要是加個新建一個filter然后加到pinyin前即可。