2011-06-06 49 views
3

我索引一個用戶必須能夠搜索的大數據庫概述(只是文本字段)(在indexFields方法中)。此前的搜索是在ILIKE查詢的數據庫中完成的,但速度很慢,所以現在搜索是在索引上完成的。 Hovewer,當我比較db查詢的搜索結果,以及索引搜索得到的結果時,從索引搜索的結果總是少得多。 林不知道如果我在索引或搜索過程中犯了錯誤。對我來說,這一切似乎都有道理。有任何想法嗎?在lucene索引搜索中缺少匹配

這是代碼。所有建議讚賞!

// INDEXING 
StandardAnalyzer analyzer = new StandardAnalyzer(
       Version.LUCENE_CURRENT, stopSet); // stop set is empty 
     IndexWriter writer = new IndexWriter(INDEX_DIR, analyzer, true, 
       IndexWriter.MaxFieldLength.UNLIMITED); 

     indexFields(writer); 
     writer.optimize(); 
     writer.commit(); 
     writer.close(); 
     analyzer.close(); 

private void indexFields(IndexWriter writer) { 

    DetachedCriteria criteria = DetachedCriteria 
      .forClass(Activit.class); 

    int count = 0; 
    int max = 50000; 
    boolean existMoreToIndex = true; 

    List<Activit> result = new ArrayList<Activit>(); 


    while (existMoreToIndex) { 

     try { 
      result = activitService.listPaged(count, max); 
      if (result.size() < max) 
       existMoreToIndex = false; 

      if (result.size() == 0) 
       return; 

      for (Activit ao : result) { 
       Document doc = new Document(); 
       doc.add(new Field("id", String.valueOf(ao.getId()), 
         Field.Store.YES, Field.Index.ANALYZED)); 
       if(ao.getActivitOwner()!=null) 
        doc.add(new Field("field1", ao.getActivityOwner(),Field.Store.YES, Field.Index.ANALYZED)); 
       if(ao.getActivitResponsible() != null) 
        doc.add(new Field("field2", ao.getActivityResponsible(), Field.Store.YES,Field.Index.ANALYZED)); 

       try { 
        writer.addDocument(doc); 
       } catch (CorruptIndexException e) { 
        e.printStackTrace(); 

      } 
      count += max; 

//SEARCH 
    public List<Activit> searchActivitiesInIndex(String searchCriteria) { 
    Set<String> stopSet = new HashSet<String>(); // empty because we do not want to remove stop words 
    Version version = Version.LUCENE_CURRENT; 
    String[] fields = { 
      "field1", "field2"}; 
    try { 
     File tempFile = new File("C://testindex"); 
     Directory INDEX_DIR = new SimpleFSDirectory(tempFile); 
     Searcher searcher = new IndexSearcher(INDEX_DIR, true); 

     QueryParser parser = new MultiFieldQueryParser(version, fields, new StandardAnalyzer(
       version, stopSet)); 


     Query query = parser.parse(searchCriteria); 

     TopDocs topDocs = searcher.search(query, 500); 

     ScoreDoc[] hits = topDocs.scoreDocs; 


     //here i always get smaller hits lenght 

     searcher.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


} 
+0

打印topDocs.totalHits,如果你還沒有做。該號碼將爲您提供與您的查詢匹配的文件總數。 – 2011-06-07 08:13:27

+0

@Shashikant Kore:我已經這麼做了,看到這個數字是對的,這就是爲什麼我發佈了這個問題。 – Julia 2011-06-07 11:26:48

回答

1

最有可能的分析是做,你是不是期待着什麼。

使用Luke打開您的索引,您可以看到您的(已分析)索引文檔以及您已解析的查詢 - 應該讓您瞭解發生了什麼問題。

另外,你可以舉一個searchCriteria的例子嗎?和相應的SQL查詢?沒有這一點,很難知道索引是否正確完成。您也可能不需要使用MultiFieldQueryParser,效率非常低。

+0

我正在使用MultiFieldQueryParser(我猜你錯過了:))!搜索標準只是簡單的字符串,如「酒店」,「熱門」或其他任何東西。我正在使用MultiFieldQueryParser,因爲我不想單獨搜索每個字段 – Julia 2011-06-06 08:06:18

+0

@Julia,那是我的觀點,如果您使用的是MultiFieldQueryParser,那麼您會分別搜索字段,它只是提供一些語法糖。如果您希望您的關鍵字在任何字段中匹配,那麼將文本合併到單個字段會更好。 – Dmitri 2011-06-06 08:31:21