因此,我有500万个字符串的elasticsearch索引,例如:“ hello”,“你好”,“ hi”。只是我的机器人的一个短语。
因此,如何创建Java Elasticsearch查询来查找最相似的字符串。
例如:“丹尼,你好吗?” ->“你好吗”。
我已经尝试过模糊搜索,但是对我来说它是不正确的。 我见过的最好的实现是:距离Levenshtein的postgres trigram,但是在500万个字符串中,它的运行速度很慢。
通常,我只需要Levenshtein距离。
答案 0 :(得分:0)
仅使用普通的Levenshtein距离将是一个问题,因为它主要查看字符,而不是整个单词和出现的顺序。
例如,考虑短语THE EYES
和THEY SEE
,Levenshtein距离将具有100%的匹配度,因为它们具有相同的字符,但它们的含义不同。
先做三元组然后再进行Levenshtein会有所帮助,但是同样容易出错,act
和cat
会给出错误的肯定匹配
我发现匹配单词Soundex
或类似算法会产生更好的结果。
这是我发现在内部使用soundex的库。
https://github.com/intuit/fuzzy-matcher
我还没有尝试过500万条记录,但是看起来它是一个轻量级的Java库,并且如果配置为在大型服务器上运行,应该会为您提供结果。