我们在应用程序中使用 flex 分析器配置了 flex 搜索。这些单词在空白处被标记,因此像<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*可以正常工作。堆栈溢出的任何人都可以解释这种怪异吗? 最佳答案 您可以为特殊字符创建 token 生成器,请参见以下示例{ "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将它们视为字母字符。
08-07 20:19