2016-01-22 43 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