2016-01-22 3 views
0

Я новичок в Lucene.Net, в некоторых поисков, которые я имел, я обнаружил, что я могу использовать Lucene в моем проекте,Lucene.net не найти спички правильно

теперь я не могу исправить ошибки в моем код.

Позвольте мне, что я объясняю в кодексе

Прежде всего я создавать индексы, как эти

 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

Смежные вопросы