Поиск Lucene с точными расстояниями редактирования - PullRequest
2 голосов
/ 15 января 2010

Я бы хотел найти индекс Lucene с расстояниями редактирования. Например, скажем, есть документ с полем FIRST_NAME; Я хочу, чтобы все документы с именами находились на расстоянии 1 редактирования от, скажем, «Джона».

Я знаю, что Lucene поддерживает нечеткие поиски (FIRST_NAME: john ~) и принимает число от 0 до 1 для управления нечеткостью. Проблема (для меня) в том, что это число напрямую не переводится на расстояние редактирования. И когда значения в документах являются короткими строками (менее 3 символов), нечеткий поиск затрудняет их поиск. Например, если есть документ с FIRST_NAME 'J', и я ищу FIRST_NAME: я ~ 0.0, я ничего не получаю обратно.

Ответы [ 2 ]

4 голосов
/ 12 мая 2010

В FuzzyQuery от Lucene вы не можете указать удаленное расстояние. Вы можете указать значение «размытости» между 0 и 1, где значения ближе к 0 указывают на широкое соответствие, а значения ближе к 1 указывают на узкое соответствие Формула для «нечеткости» следующая. (Из Lucene в действии)

http://bit.ly/9hDVuF

Из этой формулы вы можете вернуться к приблизительной нечеткости для заданного значения расстояния. Таким образом, StackOverflow должен соответствовать StackUnderflow, который находится на расстоянии 3, требуемая размытость будет составлять приблизительно 0,77.

1 голос
/ 30 января 2010

Если вам нужно только 1 расстояние редактирования и если результат может содержать точное совпадение, то вы можете использовать подстановочный знак из одного символа в языке запросов. Если имя

john

тогда запрос, соответствующий ему и любому термину в пределах 1 расстояния редактирования, будет выглядеть как

?john OR j?ohn OR jo?hn OR joh?n OR john? OR ohn OR jhn OR joh OR ?ohn OR j?hn OR jo?n OR joh?

В более сложных случаях вам может понадобиться получить список терминов в индексе (используя IndexReader.term () ), оставить те, которые находятся на расстоянии 1 редактирования, и выполнить поиск по любому из этих терминов.

...