我正在寻找一种在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
}
注意:
感谢。
答案 0 :(得分:2)
如果有一种可接受的标准方法,那就是使用Lucene。你可以使用 一些正则表达式的噱头,比如来自RegexBuddy的库(其中word1
和word2
是搜索词的占位符)和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;
}
}