Извините за беспокойство, но я надеюсь получить любую помощь от опытных людей Lucene.Lucene.Net нечеткая скорость поиска
Теперь мы используем в нашем приложении Lucene.Net 3.0.3 для индексации и поиска на ~ 2.500.000 единиц. Каждый объект содержит 27 для поиска поле, которое добавляется к индексу таким образом: новое поле (ключ, значение, Field.Store.YES, Field.Index.ANALYZED))
Теперь у нас есть два варианта поиска:
- Искать только по 4 поля с использованием нечеткого поиска
- Поиск по 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)))
Текущие улучшения:
- Мы объединили эти 4 поля на 1 поле поиска
- Мы решили использовать единый IndexSearcher в обслуживании, а не открыть в каждом поисковом запросе
- MergeFactor = 2
Общая комбинация улучшений дает около Увеличение скорости на 30-40%.
После этого article сделал большую Мы `ве возможных оптимизаций:
- Index помещается на диск SAS, который довольно быстро: http://accessories.euro.dell.com/sna/productdetail.aspx?c=ie&l=en&s=dhs&cs=iedhs1&sku=400-AHWT#Overview
- У нас есть достаточно RAM памяти
- MergeFactor 2
- Пытался переместить индекс в RAMDirectory, но результаты теста не стабильны, иногда скорость одинакова
У вас есть другие предложения, как улучшить скорость поиска в нашей ситуации?
спасибо.
Благодарим вас за комментарий. Я просто отключил основные подстановочные знаки (queryParser.AllowLeadingWildcard = false), почему я должен удалить эту строку? – SSoro
'QueryParser' запрещает использование подстановочных знаков (например,' myField: * bar') по какой-то причине, они работают крайне плохо. – femtoRgon