用Java实现邻近文本搜索

时间:2014-05-14 07:47:11

标签: java regex full-text-search

我正在寻找一种在java中实现邻近搜索的简单方法。

通过邻近搜索,我的意思是Lucene如何定义它:

  

Lucene支持在特定距离内找到单词。   要进行邻近搜索,请在a的末尾使用波浪号,#34;〜",符号   短语。例如,搜索" apache"和"雅加达" 10点以内   文档中彼此的单词使用搜索:

     

" jakarta apache" ~10

更具体地说:作为一个开始,我想实现以下形式的方法:

public static boolean proximityMatches(String txt, String term1, String term2, int wordDistance) {


// for the inputs:
// txt= "this is a really foo barred world", term1="foo", term2="world", wordDistance=4
// return true

// for the inputs:
// txt= "this is a really foo barred world", term1="this", term2="bar", wordDistance=1
// return false

}

注意:

  1. 我知道如何编写一个函数来满足我在那里提出的要求 - 我正在寻找的是一种公认​​的标准方法来实现它。
  2. 感谢。

2 个答案:

答案 0 :(得分:2)

如果有一种可接受的标准方法,那就是使用Lucene。你可以使用 一些正则表达式的噱头,比如来自RegexBuddy的库(其中word1word2是搜索词的占位符)和3 in {1,3}?是最大距离):

\b(?:word1(?:\W+\w+){1,3}?\W+word2|word2(?:\W+\w+){1,3}?\W+word1)\b

麻烦的是,这依赖于一个非常简单,任意的单词构成概念。它与收缩或带连字符的单词不匹配,但它确实匹配带有数字和下划线的“单词”。您可以调整正则表达式来处理这些问题,但会弹出更多来替换它们。虽然丑陋,但每次调整都会使正则表达式的可读性降低,难以维护。

这几乎不会影响全文搜索引擎为您节省的费用。如果您有一个非常具体,严格约束的任务要完成,正则表达式或其他“语法级”工具可能适合。但是如果你需要在语义层面工作,识别自然语言的单词和短语,你需要一个搜索引擎或其他专用工具。

答案 1 :(得分:1)

如果您正在寻找左侧的单词,您可以试试这个。

String str = "Lucene supports finding words are a within a specific distance away.";
boolean found = false;
int start = str.length() -1;
int end = str.length();

    while ( !found )
    {
        if ( str.substring( start, end).contains( "specific" ) )
        {
            int total = end - start;
            System.out.println( "You word has been found " + total + " characters to the left" );
            found = true;
        }
        else
        {
            start -= 1;
        }
    }