我们在应用程序中使用弹性分析器配置了elasticsearch。这些单词在空白处被标记,因此名称如 _<fantastic> project_被索引为
<fantastic> project
["<fantastic>", "project"]
并且 ABC-123-def项目 的索引为
["ABC-123-def", "project"]
然后,当我们搜索ABC- *时,预期的项目就会出现。但是,如果我们专门搜索<fantastic>它根本不会出现。好像Lucene / Elastic Search会忽略任何包含尖括号的搜索词。但是,即使单词未与尖括号分开索引,我们 也可以 搜索fantastic,或<*fantastic*或*fantastic*,它将很好。
<fantastic>
fantastic
<*fantastic*
*fantastic*
标准分析器标记任何非字母数字字符。 _<fantatsic>_项目被索引为
<fantatsic>
["fantastic", "project"]
并且 ABC-123-def 项目的索引为
["ABC", "123", "def", "project"]
这会破坏使用进行成功搜索的能力ABC-123-*。但是,我们使用标准分析仪得到的是有人可以专门搜索<fantastic>并返回所需的结果。
ABC-123-*
如果不是一个标准的分析器我们一个char_filter添加到空白分析仪,过滤出在标签上的角撑架,(替换<(.*)>用$1),它会被因而索引: _<fantatsic> project_被索引为
<(.*)>
$1
<fantatsic> project
(无尖括号)。和 ABC-123的高清项目 的索引为
它看起来很有希望,但是最终得到的结果与普通空白分析器的结果相同:当专门搜索时<fantastic>,虽然什么也没得到,但是*fantastic*效果很好。
堆栈溢出的任何人都可以解释这种怪异吗?
您可以为特殊字符创建令牌生成器,请参见以下示例
{ "settings" : { "index" : { "number_of_shards" : 1, "number_of_replicas" : 1 }, "analysis" : { "filter" : { "custom_filter" : { "type" : "word_delimiter", "type_table": ["> => ALPHA", "< => ALPHA"] } }, "analyzer" : { "custom_analyzer" : { "type" : "custom", "tokenizer" : "whitespace", "filter" : ["lowercase", "custom_filter"] } } } }, "mappings" : { "my_type" : { "properties" : { "msg" : { "type" : "string", "analyzer" : "custom_analyzer" } } } } }
< >作为ALPHA字符,导致基础的word_delimiter将它们视为字母字符。