使用 Elastic Search 检索标签内容和带连字符的单词
Using Elastic Search to retrieve tag contents and hyphenated words
我们在应用程序中配置了带有空格分析器的弹性搜索。这些词在空格上被标记化,所以像 <fantastic> project
这样的名字被索引为
["<fantastic>", "project"]
和ABC-123-def 项目 被索引为
["ABC-123-def", "project"]
然后当我们搜索 ABC-* 时,预期的项目出现了。但是,如果我们专门搜索 <fantastic>
,它根本不会出现。就好像 Lucene/Elastic 搜索会忽略任何包含尖括号的搜索词。但是,我们 可以 搜索 fantastic
,或 <*fantastic*
或 *fantastic*
,它发现它很好,即使这个词没有单独索引尖括号。
标准分析器对任何非字母数字字符进行分词。 <fantatsic>
项目被索引为
["fantastic", "project"]
和ABC-123-def项目被索引为
["ABC", "123", "def", "project"]
这会破坏使用 ABC-123-*
成功搜索的能力。但是,我们使用标准分析器得到的结果是,有人可以专门搜索 <fantastic>
并 returns 获得所需的结果。
如果我们将 char_filter 添加到过滤掉标签上的尖括号的空白分析器而不是标准分析器,(将 <(.*)>
替换为 </code>)它将被索引因此:
<em><code><fantatsic> project
被索引为
["fantastic", "project"]
(无尖括号)。 ABC-123-def 项目 被索引为
["ABC-123-def", "project"]
看起来很有希望,但我们得到的结果与普通空白分析器的结果相同:当我们专门搜索 <fantastic>
时,我们什么也没得到,但 *fantastic*
工作正常。
Stack Overflow 上的任何人都可以解释这种怪异现象吗?
您可以为特殊字符创建分词器,请参见以下示例
{
"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"
}
}
}
}
}
<> 作为字母字符导致底层 word_delimiter 将它们视为字母字符。
我们在应用程序中配置了带有空格分析器的弹性搜索。这些词在空格上被标记化,所以像 <fantastic> project
这样的名字被索引为
["<fantastic>", "project"]
和ABC-123-def 项目 被索引为
["ABC-123-def", "project"]
然后当我们搜索 ABC-* 时,预期的项目出现了。但是,如果我们专门搜索 <fantastic>
,它根本不会出现。就好像 Lucene/Elastic 搜索会忽略任何包含尖括号的搜索词。但是,我们 可以 搜索 fantastic
,或 <*fantastic*
或 *fantastic*
,它发现它很好,即使这个词没有单独索引尖括号。
标准分析器对任何非字母数字字符进行分词。 <fantatsic>
项目被索引为
["fantastic", "project"]
和ABC-123-def项目被索引为
["ABC", "123", "def", "project"]
这会破坏使用 ABC-123-*
成功搜索的能力。但是,我们使用标准分析器得到的结果是,有人可以专门搜索 <fantastic>
并 returns 获得所需的结果。
如果我们将 char_filter 添加到过滤掉标签上的尖括号的空白分析器而不是标准分析器,(将 <(.*)>
替换为 </code>)它将被索引因此:
<em><code><fantatsic> project
被索引为
["fantastic", "project"]
(无尖括号)。 ABC-123-def 项目 被索引为
["ABC-123-def", "project"]
看起来很有希望,但我们得到的结果与普通空白分析器的结果相同:当我们专门搜索 <fantastic>
时,我们什么也没得到,但 *fantastic*
工作正常。
Stack Overflow 上的任何人都可以解释这种怪异现象吗?
您可以为特殊字符创建分词器,请参见以下示例
{
"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"
}
}
}
}
}
<> 作为字母字符导致底层 word_delimiter 将它们视为字母字符。