我有要在ElasticSearch中编制索引的文档,其中包含一个名为name
的文本字段。我目前使用snowball
分析器索引名称。但是,我想匹配包含和不包含空格的名称。例如,名为“The Home Depot”的文档应与“homedepot”,“home”和“home depot”匹配。此外,具有单个单词名称的文档(如“埃克森美孚”)应与“埃克森美孚”和“埃克森美孚”相匹配。
我似乎无法找到正确的分析器/过滤器组合来实现这一目标。
答案 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”标记生成器而不是关键字。这允许搜索在空格上分割。