2012-08-23 58 views
0

我有一個帶有各種字段的Lucene文檔;名稱,BriefData,FullData,ParentIDs(逗號分隔字符串),ProductType,體驗。lucene.net搜索具有一個值的多個字段以及具有其他值的其他字段

我有一個搜索表單,有一個文本框,父母的下拉列表,產品類型的下拉列表,經驗下拉列表。

如果我從文本框搜索,我會得到我應該的結果。如果我從任何下拉菜單中搜索(或全部),我會得到我想要的結果。如果我使用下拉列表和文本框,我將所有結果作爲文本框或下拉列表的搜索。我想要的是文本框和下拉菜單。

所以,我的搜索建立像這樣:

 if (string.IsNullOrWhiteSpace(searchTerm)) 
     { 
      searchTerm = ""; 
      if (!string.IsNullOrWhiteSpace(Request.QueryString["textbox"])) 
      { 
       string tester = Request.QueryString["query"]; 
       searchTerm += tester; 
      } 
      if (!string.IsNullOrWhiteSpace(Request.QueryString["parent"])) 
      { 
       searchTerm += searchTerm.Length > 0 ? " " : ""; 
       searchTerm += "+ParentIDs:" + Request.QueryString["parent"]; 
      } 
      if (!string.IsNullOrWhiteSpace(Request.QueryString["product"])) 
      { 
       ProductTypes pt = db.ProductTypes.Find(int.Parse(Request.QueryString["product"])); 
       if (pt != null) { 
        searchTerm += searchTerm.Length > 0 ? " " : ""; 
        searchTerm += "+ProductType:" + pt.TypeName; 
       } 
      } 
      if (!string.IsNullOrWhiteSpace(Request.QueryString["experience"])) 
      { 
       searchTerm += searchTerm.Length > 0 ? " " : ""; 
       searchTerm += "+Experience:" + Request.QueryString["experience"]; 
      } 
     } 
     if (!Directory.Exists(Helper.LuceneSearch._luceneDir)) 
      Directory.CreateDirectory(Helper.LuceneSearch._luceneDir); 

     _searchResults = string.IsNullOrEmpty(searchField) 
          ? Helper.LuceneSearch.Search(searchTerm).Distinct() 
          : Helper.LuceneSearch.Search(searchTerm, searchField).Distinct(); 

     return View(_searchResults.Distinct()); 

如果我僅搜索文本框,下拉父母,我得到的搜索關鍵詞「北方+ ParentIDs:62」

我想是的只搜索返回結果,其父母爲62 AND(姓名或簡要數據或「北」的全數據)。

我試着創建一個「+(名稱:north BriefData:north FullData:north)+ ParentIDs:62」和「Name:north BriefData:north FullData:north + ParentIDs:62」的searchTerm。第一個返回沒有結果,第二個返回相同的只是搜索+ ParentIDs:62。

我認爲這背後的邏輯非常簡單。但是,我不知道我需要用代碼編寫什麼。

請幫忙。 :)

+0

您使用哪種分析儀?你是否也確定你已經在指定的字段中編入了包含「north」的數據? –

+0

我不知道分析儀。我的搜索代碼已發佈。 –

+0

我絕對有北索引。如果我在北部搜索,那麼我會從各個字段(名稱,簡要數據,全部數據)中獲得所有結果。 –

回答

2

感謝JF Beaulac讓我看看我包含的Lucene.Net代碼(Helper.LuceneSearch.Search(searchTerm).Distinct())我重寫了我的搜索基本上不打擾使用它,而是有點複製它。

我通過使用MultiFieldQueryParser來完成奇怪的多字段搜索。然後,我使用TermQuery進行單個字段查詢。這些都被添加到一個布爾查詢,我的搜索是針對所述布爾查詢執行的。

var hits_limit = 1000; 
var analyzer = new StandardAnalyzer(Version.LUCENE_29); 
BooleanQuery bq = new BooleanQuery(); 
if (string.IsNullOrWhiteSpace(searchTerm)) 
{ 
    searchTerm = ""; 
    if (!string.IsNullOrWhiteSpace(Request.QueryString["textbox"])) 
    { 
     string tester = Request.QueryString["textbox"]; 
     var parser = new MultiFieldQueryParser(Version.LUCENE_29, new[] { "Name", "BriefData", "FullData" }, analyzer); 
     var query = Helper.LuceneSearch.parseQuery(tester.Replace("*", "").Replace("?", ""), parser); 
     bq.Add(query, BooleanClause.Occur.MUST); 
    } 
    if (!string.IsNullOrWhiteSpace(Request.QueryString["parent"])) 
    { 
     bq.Add(new TermQuery(new Term("ParentIDs", Request.QueryString["parent"])), BooleanClause.Occur.MUST); 
    } 
    if (!string.IsNullOrWhiteSpace(Request.QueryString["product"])) 
    { 
     ProductTypes pt = db.ProductTypes.Find(int.Parse(Request.QueryString["product"])); 
     if (pt != null) { 
      bq.Add(new TermQuery(new Term("ProductType", pt.TypeName)), BooleanClause.Occur.MUST); 
     } 
    } 
    if (!string.IsNullOrWhiteSpace(Request.QueryString["experience"])) 
    { 
     bq.Add(new TermQuery(new Term("Experience", Request.QueryString["experience"])), BooleanClause.Occur.MUST); 
    } 
} 
if (!System.IO.Directory.Exists(Helper.LuceneSearch._luceneDir)) 
    System.IO.Directory.CreateDirectory(Helper.LuceneSearch._luceneDir); 

var searcher = new IndexSearcher(Helper.LuceneSearch._directory, false); 
var hits = searcher.Search(bq, null, hits_limit, Sort.RELEVANCE).ScoreDocs; 
var results = Helper.LuceneSearch._mapLuceneToDataList(hits, searcher).Distinct(); 
analyzer.Close(); 
searcher.Close(); 
searcher.Dispose(); 

return View(results); 

應當指出的是,得到的產品和經驗領域的工作,我不得不將其設置爲「Field.Index.NOT_ANALYZED」將其添加到索引時。我猜這是因爲他們只會有每個文檔的單個值。其他搜索字段是「Field.Index.ANALYZED」。

相關問題