使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?
Posted
技术标签:
【中文标题】使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?【英文标题】:Elasticsearch using NEST: How to configure analyzers to find partial words? 【发布时间】:2012-12-09 14:15:00 【问题描述】:我正在尝试按部分单词进行搜索,忽略大小写并忽略某些字母的重音。可能吗?我认为带有默认标记器的 ngram 应该可以解决问题,但我不明白如何使用 NEST 来做到这一点。
示例:“musiic”应匹配包含“music”的记录
我使用的 Elasticsearch 版本是 1.9。
我正在这样做,但它不起作用......
var ix = new IndexSettings();
ix.Add("analysis",
@"
'index_analyzer' :
'my_index_analyzer' :
'type' : 'custom',
'tokenizer' : 'standard',
'filter' : ['lowercase', 'mynGram']
,
'search_analyzer' :
'my_search_analyzer' :
'type' : 'custom',
'tokenizer' : 'standard',
'filter' : ['standard', 'lowercase', 'mynGram']
,
'filter' :
'mynGram' :
'type' : 'nGram',
'min_gram' : 2,
'max_gram' : 50
");
client.CreateIndex("sample", ix);
谢谢,
大卫
【问题讨论】:
【参考方案1】:简答
我认为您正在寻找的是fuzzy query,它使用Levenshtein distance 算法来匹配相似的单词。
nGrams 上的长答案
nGram 过滤器根据定义的最小/最大范围将文本拆分为许多较小的标记。
例如,从您的“音乐”查询中,过滤器将生成:
'mu', 'us', 'si', 'ic', 'mus', 'usi', 'sic', 'musi', 'usic', and 'music'
如您所见,musiic
与这些 nGram 令牌中的任何一个都不匹配。
为什么选择 nGrams
nGrams 的一个好处是它使通配符查询显着更快,因为所有潜在的子字符串都是在插入时预先生成和索引的(我已经看到查询从几秒加速到 15 毫秒使用nGram)。
如果没有 nGram,则必须在查询时搜索每个字符串以查找匹配项 [O(n^2)],而不是直接在索引中查找 [O(1)]。作为伪代码:
hits = []
foreach string in index:
if string.substring(query):
hits.add(string)
return hits
对
return index[query]
请注意,这是以插入速度变慢、需要更多存储空间和更重的内存使用为代价的。
【讨论】:
以上是关于使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?的主要内容,如果未能解决你的问题,请参考以下文章
NEST (ElasticSearch) 将 Highlights 匹配到文档
Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 一起使用