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

tad*_*ada 5 java lucene indexing search

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

Segeln bei den Olympischen Sommerspielen
Erdmond
Olympische Spiele
Turnen bei den Olympischen Sommerspielen
Tennis bei den Olympischen Sommerspielen
Geschichte der Astronomie
Run Code Online (Sandbox Code Playgroud)

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

fem*_*gon 3

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

  • 基于语言规则(例如匹配“fishing”“fished”和“fish”),词干提取器将术语减少到其词根(我不声称知道如何GermanStemmer处理“ge”前缀,但这将是一个很好的例子词干分析器可能会处理的东西)
  • 同义词过滤器可以处理您想要识别的特定已知同义词(例如“占星术”=“天文学”)
  • 模糊查询可用于获取低编辑距离的匹配。

除其他可能性外。

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