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" должен быть проанализирован на запрос фразы и проанализирован, и должен работать просто отлично. Другая причина устранения этого шага заключается в том, что применение лидирующего подстановочного знака к каждому термину приведет к снижению производительности. Вот почему ведущие символы подстановки должны быть включены вручную, потому что, как правило, их использование является плохой идеей.

Другие вопросы по тегам