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 на С#.