使用 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 将它们视为字母字符。