我正在使用Lucene將關鍵字與應用程序中的單詞列表進行匹配。整個過程自動化,無需任何人爲干預。從Lucene返回的結果列表中選擇最佳匹配結果(頂部和最高分數)。爲什麼Lucene不會基於整個單詞匹配返回結果?
以下代碼演示了上述功能,並將結果打印在控制檯上。
問題:
的問題是,lucene的搜索關鍵字(字要被搜索),並給出了結果,其部分與關鍵字匹配的單詞。另一方面,完全匹配的結果也存在,並沒有在第一個位置排名。
例如,如果我的lucene RAM索引包含單詞'Test'和'Test Engineer'。如果我要搜索索引「AB4_Test Eng_AA0XY11」,那麼結果將是
測試
測試工程師
雖然工程在「AB4_Test Eng_AA0XY11」的工程師匹配(這就是爲什麼它在搜索結果中列出)。但它沒有得到最高的地位。我想優化我的解決方案,將「測試工程師」放在首位,因爲它是考慮整個關鍵字的最佳匹配。任何人都可以幫助我解決這個問題嗎?
public class LuceneTest {
private static void search(Set<String> keywords) {
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
try {
// 1. create the index
Directory luceneIndex = buildLuceneIndex(analyzer);
int hitsPerPage = 5;
IndexReader reader = IndexReader.open(luceneIndex);
for(String keyword : keywords) {
// Create query string. replace all underscore, hyphen, comma, (,), {, }, . with plus sign
StringBuilder querystr = new StringBuilder(128);
String [] splitName = keyword.split("[\\-_,/(){}:. ]");
// After tokenizing also add plus sign between each camel case word.
for (String token : splitName) {
querystr.append(token + "+");
}
// 3. search
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
Query q = new QueryParser(Version.LUCENE_36, "name", analyzer).parse(querystr.toString());
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
System.out.println();
System.out.println(keyword);
System.out.println("----------------------");
for (ScoreDoc scoreDoc : hits) {
Document d = searcher.doc(scoreDoc.doc);
System.out.println("Found " + d.get("id") + " : " + d.get("name"));
}
// searcher can only be closed when there
searcher.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
private static Directory buildLuceneIndex(Analyzer analyzer) throws CorruptIndexException, LockObtainFailedException, IOException{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "Test Engineer");
map.put(2, "Test");
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
// 1. create the index
IndexWriter w = new IndexWriter(index, config);
for (Map.Entry<Integer, String> entry : map.entrySet()) {
try {
Document doc = new Document();
doc.add(new Field("id", entry.getKey().toString(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("name", entry.getValue() , Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}catch (Exception e) {
e.printStackTrace();
}
}
w.close();
return index;
}
public static void main(String[] args) {
Set<String> list = new TreeSet<String>();
list.add("AB4_Test Eng_AA0XY11");
list.add("AB4_Test Engineer_AA0XY11");
search(list);
}
}
感謝。這是一般性的幫助,我已經閱讀並嘗試過,但無法得到我想要的結果。您能指導我一些針對此問題的提示特定提示/解決方案嗎? – Wiki