与ElasticSearch中缺少的空格匹配

时间:2013-11-18 16:02:57

标签: lucene elasticsearch

我有要在ElasticSearch中编制索引的文档,其中包含一个名为name的文本字段。我目前使用snowball分析器索引名称。但是,我想匹配包含和不包含空格的名称。例如,名为“The Home Depot”的文档应与“homedepot”,“home”和“home depot”匹配。此外,具有单个单词名称的文档(如“埃克森美孚”)应与“埃克森美孚”和“埃克森美孚”相匹配。

我似乎无法找到正确的分析器/过滤器组合来实现这一目标。

2 个答案:

答案 0 :(得分:5)

我认为解决此问题的最直接方法是应用Shingle token filter,而不是创建ngrams字符,创建传入令牌的组合。您可以将它添加到您的分析器中,例如:

filter:
    ........
    my_shingle_filter:
        type: shingle
        min_shingle_size: 2
        max_shingle_size: 3
        output_unigrams: true
        token_separator: ""

您应该注意过滤器链中放置此过滤器的位置。在所有令牌分离/删除/替换已经发生之后(即在任何StopFilters,SynonymFilters,词干分析器等之后),它可能应该在链中迟到。

答案 1 :(得分:-3)

在这种情况下,您可能需要查看ngram类型的解决方案。

Ngram做了这样的事情:

鉴于文本abcd并使用ngram进行分析,您可能会得到令牌:

a
ab
abc
abcd
b
bc
bcd
c
cd
d
下面的

是一个可能适合您的设置。

您可能需要修改过滤器部分。这个特殊的过滤器可以产生长达12个单位的克数和至少两个标记。

现在,如果你需要它进行雪球给你的进一步分析(如水,水,浇水所有匹配的代币水),你需要进一步修补。

        "filter": {
            "ngram_filter": {
                "type": "nGram",
                "min_gram": 2,
                "max_gram": 12
            }
        },
        "analyzer": {
            "ngram_index": {
                "filter": [
                    "lowercase",
                    "ngram_filter"
                ],
                "tokenizer": "keyword"
            },
            "ngram_search": {
                "filter": [
                    "lowercase"
                ],
                "tokenizer": "keyword"
            }
        }
    },

这里的想法是在索引时,您希望创建在搜索时可用的正确令牌。但是,您在搜索时需要做的就是让这些令牌可用。您无需再次重新应用ngram分析器。

编辑:

我刚刚注意到的最后一件事,这个要求:“埃克森美孚”应该匹配“埃克森美孚”

可能意味着你需要做这样的事情:

            "ngram_search": {
                "filter": [
                    "lowercase"
                ],
                "tokenizer": "whitespace"

            }

请注意添加“whitespace”标记生成器而不是关键字。这允许搜索在空格上分割。