2016-01-22 87 views
0

我是lucene.net新人,在我的一些搜索中,我發現我可以在我的項目中使用lucene,Lucene.net找不到正確的匹配

現在我無法修復我的bug代碼。

讓我,我在代碼解釋

首先我創造這樣的

 var strIndexDir = path; 
     Directory indexDir = FSDirectory.Open(new DirectoryInfo(strIndexDir)); 
     Analyzer std = new StandardAnalyzer(global::Lucene.Net.Util.Version.LUCENE_30) 

    foreach (var res in resturant) 
     { 

      var doc = new Document(); 

      restaurantName = new Field("Name", 
       res.Name, Field.Store.YES, 
       Field.Index.ANALYZED, Field.TermVector.YES); 
      var restaurantId = new Field("Id", 
       res.RestaurantId.ToString(), Field.Store.YES, 
       Field.Index.NO, Field.TermVector.NO); 
      var restaurantSlug = new Field("Slug", 
       res.Slug, Field.Store.YES, 
       Field.Index.NO, Field.TermVector.NO); 
      var restaurantAddress = new Field("Address", 
       res.Address ?? "empty", Field.Store.YES, 
       Field.Index.NOT_ANALYZED, Field.TermVector.YES); 
      var resturantType = new Field("Type", 
       "restaurant", Field.Store.YES, 
       Field.Index.NO, Field.TermVector.NO); 
      doc.Add(restaurantName); 
      doc.Add(restaurantId); 
      doc.Add(restaurantSlug); 
      doc.Add(restaurantAddress); 
      doc.Add(resturantType); 

      idxw.AddDocument(doc); 
     } 
     idxw.Optimize(); 
     idxw.Close(); 

我跟我自己想的索引是好的,監守我想只要找到餐廳名和索引地址

也爲搜索查詢我用這種方式

 string strIndexDir = path; 
     Analyzer std = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 




    var indexReader = IndexReader.Open(FSDirectory.Open(path), readOnly: true); 
     var parserName = 
     new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Name", std); 
     var parserAddress = 
      new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Address", std); 
     var parserSlug = 
      new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Slug", std); 
     var parserTitle = 
      new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Title", std); 
     var searcher = new IndexSearcher(FSDirectory.Open(path)); 

     using (var srchr = new IndexSearcher(IndexReader.Open(directory,true))) 
     { 


      var qryName = parserName.Parse(q); 
      var qryAddress = parserAddress.Parse(q); 
      var qrySlug = parserSlug.Parse(q); 
      var qrytitle = parserTitle.Parse(q); 
      var cllctr = TopScoreDocCollector.Create(10, true); 
      searcher.Search(qryName, cllctr); 
      searcher.Search(qryAddress, cllctr); 
      searcher.Search(qrySlug, cllctr); 
      searcher.Search(qrytitle, cllctr); 
      var hits = cllctr.TopDocs().ScoreDocs; 

現在讓我說說問題在哪裏。

比如我搜索這個關鍵字(Q =「盒子」)要查找的餐館名稱該名稱是boxshaharkgharb,想用「盒子」

問題是,熱始終是0,但是當我鍵入boxshaharkgharb例如(q =「boxshaharkgharb」)結果是好的。

如何韓德爾是

回答

1

通過使用通配符*可以強制Lucene的通過片段進行搜索。

如果您需要爲所有查詢執行此操作 - 您需要查看您的選擇 - 因爲Lucene最適合使用全期搜索。原因是默認情況下,通配符變爲常量分數查詢,而術語搜索使用相關性對結果進行排名。

+0

非常感謝你@Giedrius,你能解釋一下嗎? – salar

+0

我需要種子在代碼中瞭解 – salar

+0

自從我使用Lucene以來已經有一段時間了,但是如果我沒有記錯的話,簡單地將查詢寫爲'box *'應該會得到所需的結果。如果你不希望強迫用戶寫*,你可以自己追加它,就像在這個答案中一樣:http://stackoverflow.com/a/5747425/212121 – Giedrius