Нечеткое совпадение подстроки в строке Lucene.NET
Я только что установил Lucene.NET.
Я делаю текстовый поиск. Я хочу проверить, содержит ли большой текст / нечеткое соответствие слова / фразы, скажем:
Eg1:
текст: "Я разместил вопрос о Lucene.NET на stackru. Получу ли я ответ?"
textToSearch: "опубликовал вопрос о Lucene"
Эти 2 должны совпадать, так как текст содержит textToSearch (кроме опечатки samll abot -> about.
Возможно ли это с библиотекой Lucene.NET?
Если нет, то поддерживает ли хотя бы одно нечеткое совпадение в тексте?
Например:
текст: "Я разместил вопрос на stackru"
textToSearch "stackovrlow" (неправильно написано)
2 ответа
Да, Lucene.Net поддерживает одно нечеткое сопоставление в тексте. Вы можете сделать это с помощью FuzzyQuery.
К сожалению, вы могли только каким-то образом подражать поведению первого примера. Одно из возможных решений - создать большой BooleanQuery, в котором каждое предложение будет FuzzyQuery, но это также приведет к снижению производительности, так как теряет порядок терминов.
Другая возможность заключается в использовании SpanNearQuery, который поможет сохранить позиции (вы можете указать необходимый отстой), но нет возможности добавить FuzzyQuery в качестве предложений (вы можете только как-то попытаться использовать SpanRegexQuery)
Mysterion прав, что Span Queries могут быть полезны, но не правы, говоря, что FuzzyQueries нельзя использовать. Вот для чего предназначен SpanMultiTermQueryWrapper. Что-то вроде этого:
SpanQuery query = new SpanNearQuery.Builder("myField", true).
.addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "question"))))
.addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "abot"))))
.addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "lucene"))))
.build();
Помните, что, кстати, при построении запросов вручную (а не с использованием анализатора запросов) необходимо учитывать анализ, поскольку они не будут проходить через анализатор.