Нечеткое совпадение подстроки в строке 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();

Помните, что, кстати, при построении запросов вручную (а не с использованием анализатора запросов) необходимо учитывать анализ, поскольку они не будут проходить через анализатор.

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