2012-09-19 3 views
1

Lucene을 사용하여 키워드를 응용 프로그램 내의 단어 목록과 비교합니다. 사람의 개입없이 전체 프로세스가 자동화됩니다. Lucene에서 반환 된 결과 목록에서 가장 일치하는 결과 (최고 점수와 최고 점수 중 하나)가 선택됩니다.Lucene이 전체 단어 일치를 기반으로 결과를 반환하지 않는 이유는 무엇입니까?

다음 코드는 위의 기능을 보여주고 결과는 콘솔에 인쇄됩니다.

문제점 :

문제는 루씬 키워드 (검색 할 단어)를 검색하고, 그 결과 부분적으로 키워드와 일치하는 단어를 제공한다는 것이다. 반면에 전체 일치 결과도 존재하며 첫 번째 순위에 순위가 매겨지지 않습니다.

예를 들어, 'Test'및 'Test Engineer'라는 단어가 포함 된 lucene RAM 색인이있는 경우. 내가 '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

당신은 당신이 Test Engineer의 검색을 적용 할 수있는 방법을 볼 수있는 Lucene Query syntax rules을 볼 수있다. 쿼리를 사용하여 기본적으로

, 같은 나는 그것의 확실하지 오전하지만

AB4_Test AND Eng_AA0XY11 

일뿐. 위의 링크가 가리키는 페이지는 매우 간결하며 사용자의 요구를 충족시킬 수있는 쿼리를 신속하게 찾을 수 있습니다.

+0

감사합니다. 그것은 내가 이미 읽고 밖으로 시도했지만 내 원하는 results.Can이 문제에 대한 특정 팁/팁 솔루션을 안내 할 수없는 일반적인 도움이 무엇입니까? – Wiki

관련 문제