2015-02-18 1 views
0

Я ищу пушисто для имени и фамилии в Lucene (с расстоянием levenshtein 2 каждый) во входной строке/документе с использованием нечетких запросов.Объединение запросов нечетких и spanNear в Lucene

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

Мой код для создания запроса:

FuzzyQuery firstNameQuery = new FuzzyQuery(new Term("text", firstName), 2); 
FuzzyQuery lastNameQuery = new FuzzyQuery(new Term("text", lastName), 2); 

SpanQuery[] clauses = new SpanQuery[] { 
    new SpanMultiTermQueryWrapper<MultiTermQuery>(firstNameQuery), 
    new SpanMultiTermQueryWrapper<MultiTermQuery>(lastNameQuery) 
}; 
SpanNearQuery spanNearQuery = new SpanNearQuery(clauses, 3, false); 

То, что я вижу сейчас в моем тестовом модуле является то, что члены с levenshstein расстоянием 1, кажется, работает, так что «Джон Doa», «Джон Dox», и т.д. будет соответствовать «John Doe», но расстояние levenshstein 2 не будет, например «Джонни Доу» не будет соответствовать.

Длина пролета работает нормально, у меня может быть до трех терминов между именами и фамилиями.

Может кто-нибудь просветить меня о том, что я делаю неправильно?

Update 1

К сожалению, я испортил пример, который я изловчился здесь и не использовать реальные данные по причинам конфиденциальности.

Что я вижу, так это то, что запрос не работает вообще так, как я себе представлял.

Строка ввода: "Пациент: John Doe" запроса: spanNear ([SpanMultiTermQueryWrapper (текст: John ~ 2), SpanMultiTermQueryWrapper (текст: Doe ~ 2)], 3, ложные)

Это не создает хит, хотя условия должны точно совпадать (расстояние редактирования 0).

+0

Расстояние между «John» и «Johnnie» равно 3. – femtoRgon

+0

Извините, я испортил пример и обновил вопрос. Не могли бы вы снова взглянуть? –

+0

Вы использовали Java-версию Lucene? Это похоже на C#, но в Lucene.Net нет (больше) SpanMultiTermQueryWrapper. Или вы можете указать мне где-нибудь там, где я могу получить версии Lucene.Net, где это было все еще, потому что spceific класс находится в базе кода в GitHub ... –

ответ

1

Lucene 4.x нечеткий будет соответствовать расстоянию редактирования 2 или менее за период, а ваш прецедент имеет расстояние больше 2 за период (John and Johnnie - это расстояние 3).

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

Лучший и самый быстрый способ заключается в использовании «энграммы» подход для нечетких совпадений (триграмма нечеткого соответствия является общим!)

Update: Похоже, вы можете иметь проблемы с прописными буквами в нижнем регистре, в моем понимании lucene отбрасывает анализаторы запросов для нечеткого поиска.

Можете ли вы попробовать с «john» и «doe» (оба в нижнем регистре) в качестве вашего имени и фамилии и сообщить мне, работает ли это.

+0

Извините, я испортил пример и обновил вопрос. Не могли бы вы снова взглянуть? –

+1

Попробуйте со всеми строчными буквами «john» и «doe», я думаю, что lucene отбрасывает анализаторы запросов для нечеткого поиска. – Rushik

+0

Спасибо, преобразование условий запроса в нижний регистр разрешило проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^