2015-09-19 5 views
0

Извините за беспокойство, но я надеюсь получить любую помощь от опытных людей Lucene.Lucene.Net нечеткая скорость поиска

Теперь мы используем в нашем приложении Lucene.Net 3.0.3 для индексации и поиска на ~ 2.500.000 единиц. Каждый объект содержит 27 для поиска поле, которое добавляется к индексу таким образом: новое поле (ключ, значение, Field.Store.YES, Field.Index.ANALYZED))

Теперь у нас есть два варианта поиска:

  1. Искать только по 4 поля с использованием нечеткого поиска
  2. Поиск по 4-27 полей с помощью точного поиска

у нас есть сервис поиска, каждую неделю автоматически ищет около 53000 таких людей «Боб Хьюстоном», « Сара Конор "," Суян Хун Уин Хо И т.д.

Так мы испытываем медленную скорость поиска в опции , это s an average 4-8 sec in searcher.Search and it это наша главная проблема.

Поиск Пример кода:

   var index = FSDirectory.Open(indexPath); 
       var searcher = new IndexSearcher(index, true); 
       this.analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>()) 
       var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, queryFields, this.analyzer); 
       queryParser.AllowLeadingWildcard = false; 
       Query query; 
       query = queryParser.Parse(token); 
       var results = searcher.Search(query, NumberOfResults);// NumberOfResults==500 

Наш нечеткое поисковый запрос, чтобы найти «боб Цун хун» в 4-х областях:

(((PersonFirstName: боб ~ 0,6) OR (PersonLastName: боб ~ 0,6) ИЛИ (PersonAliases: bob ~ 0.6) ИЛИ (PersonAlternativeSpellings: bob ~ 0.6)) AND ((PersonFirstName: cong ~ 0.6) ИЛИ (PersonLastName: cong ~ 0.6) ИЛИ (PersonAliases: cong ~ 0.6) ИЛИ (PersonAlternativeSpellings: cong ~ 0.6)) AND ((PersonFirstName: hong ~ 0,6) ИЛИ (PersonLastName: hong ~ 0,6) ИЛИ (PersonAliases: hong ~ 0,6) ИЛИ (PersonAlternativeSpellings: hong ~ 0,6)))

Текущие улучшения:

  1. Мы объединили эти 4 поля на 1 поле поиска
  2. Мы решили использовать единый IndexSearcher в обслуживании, а не открыть в каждом поисковом запросе
  3. MergeFactor = 2

Общая комбинация улучшений дает около Увеличение скорости на 30-40%.

После этого article сделал большую Мы `ве возможных оптимизаций:

У вас есть другие предложения, как улучшить скорость поиска в нашей ситуации?

спасибо.

ответ

1

Вы можете улучшить скорость нечетких запросов, установив их длину префикса на ненулевое значение. Это позволит lucene эффективно сузить набор возможных результатов. Как это:

queryParser.FuzzyPrefixLength = 2; 

Кроме того, он не влияет на запрос вы предоставили в качестве примера, но если вы заботитесь на все о производительности, вы должны удалить строку queryParser.AllowLeadingWildcard = false;. Ведущие подстановочные знаки полностью уничтожают производительность.

+0

Благодарим вас за комментарий. Я просто отключил основные подстановочные знаки (queryParser.AllowLeadingWildcard = false), почему я должен удалить эту строку? – SSoro

+0

'QueryParser' запрещает использование подстановочных знаков (например,' myField: * bar') по какой-то причине, они работают крайне плохо. – femtoRgon

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