我想用Lucene使用正則表達式來查找「Bug報告」,但每當我嘗試它時都不起作用。使用Lucene查找正則表達式匹配?
我使用了Lucene page中的代碼來避免錯誤的設置。
這裏是我的代碼:
import java.util.regex.Pattern;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.regex.JakartaRegexpCapabilities;
import org.apache.lucene.search.regex.RegexCapabilities;
import org.apache.lucene.search.regex.RegexQuery;
import org.apache.lucene.store.RAMDirectory;
public class Rege {
private static IndexSearcher searcher;
private static final String FN = "field";
public static void main(String[] args) throws Exception {
RAMDirectory directory = new RAMDirectory();
try {
IndexWriter writer = new IndexWriter(directory,
new SimpleAnalyzer(), true,
IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();
doc
.add(new Field(
FN,
"[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",
Field.Store.NO, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.optimize();
writer.close();
searcher = new IndexSearcher(directory, true);
} catch (Exception e) {
e.printStackTrace();
}
System.err.println(regexQueryNrHits("bug [0-9]+",null));
}
private static Term newTerm(String value) {
return new Term(FN, value);
}
private static int regexQueryNrHits(String regex,
RegexCapabilities capability) throws Exception {
RegexQuery query = new RegexQuery(newTerm(regex));
if (capability != null)
query.setRegexImplementation(capability);
return searcher.search(query, null, 1000).totalHits;
}
}
我希望bug [0-9]+
返回1
但事實並非如此。我也用Java測試了正則表達式,它工作。
問題不在於數字。問題在於如何使用正則表達式查詢和分析來協同工作。你的正則表達式必須匹配* term *,而不是整個字段。這就是爲什麼它與NOT_ANALYZED一起工作的原因,你已經把整個領域變成了一個單一的術語。但有一個警告。當你創建一個未經分析的領域時,你放棄了使用搜索索引的大部分優勢(例如性能)。 – femtoRgon