2015-11-09 6 views
1

Мы реализовали поиск по курсам, использующим Apache lucene. Он работает нормально. Но у меня есть 2 записи, а именно «Сделайте это персоналом» и «Сделайте все правильно». Когда я ищу «сделать» «персонал», я получаю результаты, но когда я ищу «сделать это», результаты не найдены. Но он хорошо работает с «сделай это»! Я действительно смущен, почему он не работает для «сделай это». КСТАТИ запроса анализатор определяется, как показано ниже,C# - поиск Lucene не работает для нескольких строковых литералов

private readonly StandardAnalyzer _analyzer; 
_analyzer = new StandardAnalyzer(Version.LUCENE_29); 
var parser = new MultiFieldQueryParser(Version.LUCENE_29, new[] { "Name",  "Description", "Id" }, _analyzer); 

var queryParser = parseQuery(BuildPrefixQuery(input), parser); 

var hits = searcher.Search(queryParser, null, 50, Sort.RELEVANCE).ScoreDocs; 

& и код создания индекса

public void CreateIndex(List<ILucenceProperties> ListILucenceProperties) 
    { 
var writer = new IndexWriter(_directory, _analyzer, true,  IndexWriter.MaxFieldLength.UNLIMITED); 

     foreach (var iLucenceProperties in ListILucenceProperties) 
     { 
      var document = new Document(); 

      document.Add(new Field("Id", iLucenceProperties.Id, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Name", iLucenceProperties.Name, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Description", iLucenceProperties.Description, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Category", iLucenceProperties.Category, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("FilterID", iLucenceProperties.FilterID, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("ColumnName", iLucenceProperties.ColumnName, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("AdditionalSearchParameter", iLucenceProperties.AdditionalSearchParameter, Field.Store.YES, Field.Index.NO)); 
      writer.AddDocument(document); 
     } 

     writer.Optimize(); 
     writer.Dispose(); 
    } 

Выше, «Имя» поле содержит имя, конечно, «Id» содержит идентификатор, конечно, «Описание "содержит другой идентификатор, конечно и так далее.

Это моя мысль, что проблема может быть с анализатором/анализатором. Пожалуйста, помогите мне.

+0

Я думаю, нам нужно будет увидеть немного больше кода, в частности, код, который фактически соответствует вещам с запросами, и, возможно, даже покажет нам некоторые реальные (если возможно) образцы данных, в которых используются эти ключевые слова. – username

ответ

0

StandardAnalyzer отфильтровывает стоп-слова, такие как «это». Но когда вы ищете, вы включаете «это» в качестве ключевого слова. Вы можете использовать StandardAnalyzer constructor, который берет список стоп-слов и вызывает его с пустым набором.

+0

Супер! Спасибо. Следующие изменения сработали. _analyzer = new StandardAnalyzer (Version.LUCENE_29, CharArraySet.EMPTY_SET); – Naveenk

+0

Но для таких курсов, как «html/java programming», он не работает. т. е. когда специальный символ «\» или «/» является частью названия курса. Мы разрешаем использовать только эти специальные символы в названиях курсов. Не могли бы вы помочь мне? – Naveenk

+0

Вы можете попытаться избежать специальных символов или попробовать другой токенизатор. См. [This] (http://stackoverflow.com/questions/6107875/how-to-search-special-characters-in-lucene). – Tamas

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

  • Нет связанных вопросов^_^