Lucene поиск с использованием StopWords в StandardAnalyzer
У меня есть следующая проблема с использованием Lucene.NET 3.0.3.
Мой проект анализирует документы, используя StandardAnalyzer с StopWord-List (объединенные немецкие и английские слова).
Во время поиска я создаю свой поисковый запрос вручную и анализирую его с помощью MultiFieldQueryParser. Анализатор инициализируется тем же анализатором, что и индексирование документов.
Проанализированный поисковый запрос инициализировал BooleanQuery. Поиск BooleanQuery и TopScoreDocCollector в индексе Lucene с помощью IndexSearcher.
Мой код выглядит так:
using (StandardAnalyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30, roxConnectionTools.getServiceInstance<ISearchIndexService>().GetStopWordList()))
{
...
MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, searchFields, analyzer);
parser.MultiTermRewriteMethod = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
parser.AllowLeadingWildcard = true;
...
Query searchQuery = parser.Parse(searchStringBuilder.ToString().Trim);
...
BooleanQuery boolQuery = new BooleanQuery();
boolQuery.Add(searchQuery, Occur.MUST);
...
TopScoreDocCollector scoreCollector = TopScoreDocCollector.Create(SearchServiceTools.MAX_SCORE_COLLECTOR_SIZE, true);
...
searcher.Search(boolQuery, scoreCollector);
ScoreDoc[] scoreDocs = scoreCollector.TopDocs().ScoreDocs;
}
Если я индексирую поле документа со значением "Test- und Produktivumgebung", я не могу найти этот документ, выполнив поиск по этому термину.
Я получу результаты, если я исправлю поисковый запрос на "Test- Produktivumgebung".
Слово "унд" есть в моем StopWord-List.
Мой поисковый запрос выглядит следующим образом:
Сгенерированный вручную поисковый запрос: (+ * Test * + * und * + * Produktivumgebung *)
Анализируемый поисковый запрос: + (title: * Test *) + (title: * und *) + (title: * Produktivumgebung *)
Почему я не могу найти документ в поиске "Test- und Produktivumgebung"?
1 ответ
Подстановочные знаки не анализируются (см. Этот вопрос, например). Так как вы (если я правильно понимаю) интерпретируете запрос "Test- und Produktivumgebung"
в (+*Test* +*und* +*Produktivumgebung*)
анализатор не используется ни для одного из этих подстановочных запросов, и стоп-слова не будут удалены.
Если вы исключите шаг, который выполняет этот перевод, запрос "Test- und Produktivumgebung"
должен быть проанализирован на запрос фразы и проанализирован, и должен работать просто отлично. Другая причина устранения этого шага заключается в том, что применение лидирующего подстановочного знака к каждому термину приведет к снижению производительности. Вот почему ведущие символы подстановки должны быть включены вручную, потому что, как правило, их использование является плохой идеей.