使用弹性搜索来检索标记内容和带连字符的单词

时间:2016-03-01 17:52:47

标签: regex elasticsearch lucene tags elasticsearch-plugin

我们在应用程序中使用空白分析器配置了弹性搜索。单词在空格上被标记化,因此 <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上的任何人都可以解释这种奇怪吗?

1 个答案:

答案 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将其视为字母字符。