2012-09-19 19 views
1

我正在使用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); 
} 
} 

回答

0

你可以看看Lucene Query syntax rules看你如何執行搜索Test Engineer

基本上,使用查詢,如

AB4_Test AND Eng_AA0XY11 

可能的工作,雖然我不知道這一點。上面鏈接指向的頁面非常簡潔,您將能夠快速找到能夠滿足您需求的查詢。

+0

感謝。這是一般性的幫助,我已經閱讀並嘗試過,但無法得到我想要的結果。您能指導我一些針對此問題的提示特定提示/解決方案嗎? – Wiki

相關問題