【问题标题】:create and query a n-gram index with lucene使用 lucene 创建和查询 n-gram 索引
【发布时间】:2013-10-06 02:09:42
【问题描述】:

我想从我的输入文件中构建一个包含每行 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中实现它,而不是在命令行上建立索引。

【问题讨论】:

    标签: java search lucene indexing


    【解决方案1】:

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

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

    还有其他可能性。

    就在 NGrams 上实现而言,NGramTokenizer 将是正确的标记器。

    【讨论】:

    • 感谢您的回答。我用 GermanStemmer 尝试了一些东西,但并不满意。此外,我并不是真的在寻找同义词,而是在寻找输入错误等。模糊查询也不起作用,因为如果搜索词与我的索引中的任何内容相距甚远,它们就无法给我尽可能多的建议。 NGramTokenizer 看起来很有前途,你有一个例子如何建立索引并使用 NGramTokenizer 查询它吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多