所以,我有包含 500 万个字符串的 Elasticsearch 索引,例如:“hello”、“how are you”、“hi”。只是我的机器人的短语。
那么,如何创建 Java Elasticsearch 查询来查找最相似的字符串。
例如:“你好吗,丹尼?” ->“你好吗”。
我尝试过模糊搜索,但它对我来说并不正确。 我见过的最好的实现是:postgres trigrams with Levenshtein distance,但在 500 万个字符串中它运行缓慢。
一般来说,我只需要编辑距离。
最佳答案
仅使用简单的 Levenshtein 距离将会是一个问题,因为它主要查看字符而不是整个单词及其出现的顺序。
例如,考虑短语 THE EYES
和 THEY SEE
,编辑距离将给出 100% 匹配,因为它们具有相同的字符,但它们意味着不同的东西。
先进行 trigrams,然后进行 Levenshtein 会有所帮助,但同样容易出错,其中 act
和 cat
会给出误报匹配
我发现匹配单词Soundex
或类似的算法可以给出更好的结果。
这是一个我发现在内部使用 soundex 很有用的库。
https://github.com/intuit/fuzzy-matcher
我还没有尝试过 500 万条记录,但看起来它是一个轻量级 Java 库,如果配置为在大型服务器上运行,应该会给出结果。
关于java - 使用elasticsearch搜索最相似的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636441/