Lucene - Подстановочные знаки в фразах

В настоящее время я пытаюсь использовать Lucene для поиска данных, заполненных индексом.

Я могу сопоставлять точные фразы, заключая их в скобки (т.е. "Обработка документов" ), но не может заставить Lucene найти эту фразу, выполнив какой-либо "Обработчик документа".

Очевидная разница - это подстановочный знак в конце.

В настоящее время я пытаюсь использовать Luke для просмотра и поиска индекса. (он отбрасывает звездочку в конце фразы при разборе)

Добавление котировок вокруг данных, по-видимому, является основным виновником поиска документа *, но "document *" не

Любая помощь будет принята с благодарностью

Ответ 1

Не только QueryParser не поддерживает подстановочные знаки во фразах, сам PhraseQuery поддерживает только Условия. MultiPhraseQuery приближается, но, как говорится в сводке, вам все равно нужно перечислить IndexReader.terms самостоятельно, чтобы он соответствовал шаблону.

Ответ 2

Lucene 2.9 имеет ComplexPhraseQueryParser, который может обрабатывать подстановочные знаки в фразах.

Ответ 3

То, что вы ищете, это FuzzyQuery, что позволяет искать результаты с похожими словами на основе расстояние Левенштейна. В качестве альтернативы вы также можете рассмотреть возможность использования slop of PhraseQuery (также доступно в MultiPhraseQuery), если порядок слов не является значительным.

Ответ 4

Кажется, что QueryParser по умолчанию не может справиться с этим. Возможно, вы можете создать пользовательский QueryParser для подстановочных знаков в фразах. Если ваш пример репрезентативен, stemming может решить вашу проблему. Пожалуйста, прочитайте документацию для PorterStemFilter, чтобы узнать, подходит ли она.

Ответ 5

Другой альтернативой является использование NGrams и, в частности, EdgeNGram. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

Это создаст индексы для ngrams или частей слов. Документы с размером мин. Ngram 5 и максимальным размером ngram 8 будут индексироваться: Docum DOCUME Документ Документы

Существует немного компромисса для размера и времени индекса. Одна из книг Solr цитируется в качестве приблизительного руководства: Индексирование занимает 10 раз дольше Использует в 5 раз больше дискового пространства Создает в 6 раз более четкие термины.

Однако EdgeNGram будет лучше, чем это.

Вам нужно убедиться, что вы не отправляете подстановочный знак в своих запросах. Поскольку вы не выполняете поиск по шаблону, вы соответствуете поисковому запросу на ngrams (части слов).

Ответ 6

Я также искал одно и то же, и то, что я нашел, это PrefixQuery дает комбинацию из какой-то вещи, такой как "Обработчик документа". Но дело в том, что ваша область, которую вы ищете, должна быть незакрашена и хранить ее в нижнем регистре (причина в том, что так как это незакрытый индексщик не сохранит ваши значения полей в нижнем регистре), чтобы это работало. Вот код для PrefixQuery, который работал на меня: -

List<SearchResult> results = new List<SearchResult>();
Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false);
IndexSearcher searcher = new IndexSearcher( searchDir );
Hits hits;

BooleanQuery query = new BooleanQuery();
query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST);
hits = searcher.Search(query);
this.FillResults(hits, results);

Ответ 7

Используйте SpanNearQuery с отступом 0.

К сожалению, в Lucene.Net нет SpanWildcardQuery. Либо вам нужно будет использовать SpanMultiTermQueryWrapper, либо с минимальными усилиями вы можете преобразовать java version на С#.