java - 使用 lucene 创建和查询 n-gram 索引

标签 java search lucene indexing

我想构建一个索引,其中包含输入文件中每一行的 n-gram,如下所示:

Segeln bei den Olympischen Sommerspielen
Erdmond
Olympische Spiele
Turnen bei den Olympischen Sommerspielen
Tennis bei den Olympischen Sommerspielen
Geschichte der Astronomie

我需要 n-gram,因为我想在索引中搜索,但我必须假设搜索词中有很多打字错误。例如,如果我搜索术语“schichte astrologie”,我想找到“Geschichte der Astronomie”。如果它能给我一个可能的最佳比赛列表,那就更好了,比如说最好的 10 场比赛,不管它们有多糟糕。 如果有比使用 n-gram 更好的方法来实现这一点,或者您有关于如何创建索引以及如何查询索引的提示,我希望您能为我指明正确的方向。我很高兴有一个例子可以帮助我理解如何去做。 我目前使用 lucene 4.3.1。我更愿意在 java 中实现它,而不是在命令行上构建索引。

最佳答案

有很多不同的方法可以解决这个问题,Lucene 有很多工具可以帮助解决这些问题。在我看来,N-Grams 可能不是这种情况下的最佳方法。

  • 词干提取器根据语言规则(例如匹配“fishing”、“fished”和“fish”)将术语缩减为词根(我不声称知道 GermanStemmer 如何处理“ge”前缀,但将是词干分析器可能处理的事情的一个很好的例子)
  • 同义词过滤器可以处理您想要识别的特定已知同义词(例如“astrology”=“astronomy”)
  • 模糊查询可用于获得低编辑距离的匹配。

还有其他可能性。

就 NGrams 的实现而言,NGramTokenizer将是正确的分词器。

关于java - 使用 lucene 创建和查询 n-gram 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19090387/

相关文章:

php - 如何使用 mySql 唯一 ID/列名称搜索记录?

java - 看似等效的 Solr 查询之间的评分差异

java - 将 StringBuilder#AppendFormat 转换为 java

java - 在java中使用套接字的本地客户端的ID

android - 如何为 Google Map Api V2 Android 实现搜索功能?

lucene - 是否可以遍历存储在 Lucene Index 中的文档?

java - NiFi - 更新处理器中的 Luwak (Lucene) 索引

java - 我应该使用哪种 Java 集合类型?

java - 当我的子类位于不同的包中时,为什么我的子类无法访问其父类(super class)的 protected 变量?

python - 在列表中的元素中搜索子字符串并删除元素