有人可以告诉我如何在 Lucene.net 中实现“您的意思是”功能吗?
谢谢!
您应该查看 contrib 目录中的SpellChecker模块。它是 Java lucene 的SpellChecker模块的一个端口,因此它的文档应该会有所帮助。
(来自javadocs:)
示例用法:
import org.apache.lucene.search.spell.SpellChecker;
SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
// To index a field of a user index:
spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
// To index a file containing words:
spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);
AFAIK Lucene 支持邻近搜索,这意味着如果您使用以下内容:
场:搅拌~0.5
(它是波浪号)
将匹配“字符串”。浮点数是搜索的“容忍度”,其中 1.0 是完全匹配,0.0 是匹配所有内容(有点)。
然而,不同的解析器会以不同的方式实现这一点。
邻近搜索比模糊搜索 (stri*) 慢得多,因此请谨慎使用。在您的情况下,人们会假设如果您在常规搜索中找不到匹配项,您会尝试进行邻近搜索以查看您找到的内容,并以某种方式根据结果呈现“您的意思是”。
出于性能原因,缓存此类查找以查找非常常见的拼写错误可能很有用。
谷歌的“你的意思是?” 是(可能;他们当然是秘密的)通过查询他们的查询日志来实现。查看搜索您正在处理的查询的人是否很快搜索了非常相似的内容;如果是这样,则表明他们犯了一个错误,并意识到他们应该寻找什么。
由于您可能没有庞大的查询日志,因此您可以对其进行近似。取查询,拆分词条,查看数据库中是否有相似词条(通过编辑距离等);用附近的术语替换您的术语,然后重新运行查询。如果您获得更多点击,那可能是一个更好的查询。推荐给用户。(而且由于您已经获得了热门歌曲,并且大多数人只查看前 2 个结果,因此向他们展示这些结果。)
看一下名为语义向量的谷歌代码项目。在 Lucene 邮件列表上进行了大量讨论,以执行您使用后的功能 - 但是它是用 java 编写的。
您可能必须在搜索日志中解析和使用一些机器学习算法来构建这样的功能!