




AFAIK Lucene поддерживает поиск по близости, что означает, что если вы используете что-то вроде:
поле: перемешивание ~ 0,5
(это знак тильды)
будет соответствовать "строке". float показывает, насколько «терпимым» будет поиск, где 1.0 - точное совпадение, а 0.0 - соответствие всему (вроде).
Однако разные парсеры реализуют это по-разному.
Поиск по близости работает намного медленнее, чем нечеткий поиск (stri *), поэтому используйте его с осторожностью. В вашем случае можно было бы предположить, что, если вы не найдете совпадений при обычном поиске, вы попробуете поиск по близости, чтобы увидеть, что вы найдете, и представите «вы имели в виду» как-то на основе результата.
Может быть полезно кэшировать такого рода поисковые запросы для очень распространенных ошибок написания по соображениям производительности.
Google "Вы имели в виду?" (возможно; они, конечно, секретные) реализованы путем просмотра их журнала запросов. Посмотрите, не ищут ли вскоре люди, которые искали запрос, который вы обрабатываете, что-то очень похожее; если да, это означает, что они совершили ошибку и поняли, что им следует искать.
Поскольку у вас, вероятно, нет огромного журнала запросов, вы можете приблизить его. Возьмите запрос, разделите термины, посмотрите, есть ли похожие термины в базе данных (по расстоянию редактирования, что угодно); замените ваши термины ближайшими терминами и повторите запрос. Если вы получите больше совпадений, это, вероятно, лучший запрос. Предложите это пользователю. (И поскольку у вас уже есть хиты, и большинство людей смотрят только на 2 лучших результата, покажите им их.)
Вам следует заглянуть в модуль Программа проверки орфографии в каталоге contrib. Это порт модуля Программа проверки орфографии Java lucene, поэтому его документация должен быть вам полезен.
(Из javadocs :)
Пример использования:
import org.apache.lucene.search.spell.SpellChecker;
SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
// To index a field of a user index:
spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
// To index a file containing words:
spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);
это правильный ответ, следует принять! именно то, что я искал;)
Модуль SpellChecker перемещен: svn.apache.org/repos/asf/lucene/lucene.net/trunk/C%23/contri b /…
Взгляните на проект кода Google, называемый семантическими векторами. В списках рассылки Lucene ведется приличное количество дискуссий о выполнении таких функций, как то, что вы используете после этого, однако он написан на java.
Вам, вероятно, придется проанализировать и использовать некоторые алгоритмы машинного обучения в ваших журналах поиска, чтобы создать такую функцию!
Есть простое объяснение того, что здесь означает «Возможно, вы имели в виду» norvig.com/spell-correct.html, это очень интересное чтение.