我们在应用程序中使用空白分析器配置了弹性搜索。单词在空格上被标记化,因此 <fantastic> project
之类的名称被索引为
["<fantastic>", "project"]
和 ABC-123-def项目被编入索引为
["ABC-123-def", "project"]
当我们搜索ABC- *时,预期的项目会出现。但是,如果我们专门搜索<fantastic>
,它根本就不会出现。好像Lucene / Elastic Search忽略了包含尖括号的任何搜索词。但是,我们可以搜索fantastic
,或<*fantastic*
或*fantastic*
并且它会发现它很好,即使该单词没有与尖括号分开编制索引。
标准分析器对任何非字母数字字符进行标记。 <fantatsic>
项目编入索引为
["fantastic", "project"]
和 ABC-123-def 项目被编入索引为
["ABC", "123", "def", "project"]
这打破了使用ABC-123-*
成功搜索的能力。但是,我们使用标准分析器得到的是,有人可以专门搜索<fantastic>
并返回所需的结果。
如果不是标准分析器,我们在空白分析器中添加一个char_filter,过滤掉标签上的尖括号,(用<(.*)>
替换$1
),它将被索引:
<fantatsic> project
被编入索引为
["fantastic", "project"]
(没有尖括号)。并且 ABC-123-def项目被编入索引为
["ABC-123-def", "project"]
看起来很有希望,但我们最终得到的结果与普通空白分析器的结果相同:当我们专门搜索<fantastic>
时,我们什么也得不到,但*fantastic*
工作正常。
Stack Overflow上的任何人都可以解释这种奇怪吗?
答案 0 :(得分:2)
您可以为特殊字符创建标记化器,请参阅以下示例
{
"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"
}
}
}
}
}
&lt;&gt; 作为ALPHA字符,导致基础word_delimiter将其视为字母字符。