2010-01-15 5 views
2

편집 거리가있는 Lucene 색인을 검색하고 싶습니다. 예를 들어 FIRST_NAME 필드가있는 문서가 있습니다. 나는 'john'과 거리가 먼 편집 명을 가진 모든 문서를 원합니다.정확한 편집 거리를 가진 Lucene 검색

Lucene이 퍼지 검색 (FIRST_NAME : john ~)을 지원하고 퍼지를 제어하기 위해 0과 1 사이의 숫자를 사용한다는 것을 알고 있습니다. 문제는 (나를 위해)이 숫자가 편집 거리로 직접 변환되지 않는다는 것입니다. 그리고 문서의 값이 짧은 문자열 (3 문자 미만) 일 때 퍼지 검색은 찾기 어렵습니다. 예를 들어 'FIRST_NAME'이 (가)있는 문서가 있고 FIRST_NAME을 (를) 검색 한 경우 : I ~ 0.0 나는 아무것도 반환하지 않습니다.

답변

1

거리를 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 편집 거리만큼 떨어진 곳에두고 해당 용어를 검색하십시오.

4

Lucene의 FuzzyQuery에서는 근사 거리를 지정할 수 없습니다. 0에 가까운 값은 확장 검색을 나타내고 1에 가까운 값은 좁은 일치를 나타낼 때 0과 1 사이의 "퍼지움"값을 지정할 수 있습니다. "fuzziness"공식은 다음과 같습니다. 이 식으로부터

http://bit.ly/9hDVuF

(루씬의 조치에)는 거리 지정 값에 근사 번짐 다시 작동 할 수있다. 따라서 StackOverflow은 거리 3에있는 StackUnderflow과 일치해야하며, 필요한 불투명도는 약 0.77입니다.

+1

Lucene을 살펴보면 93 페이지의 수식은'1-distance/min (textlen, targetlen)'이지만 0.0보다 작은 값을 허용하기 때문에 완전히 바뀔 수는 없습니다. 필자의 테스트에서 수식은 실제로'1 - 거리/최대 (textlen, targetlen) '을 사용하는 LevensteinDistance 구현과 달리'min (textlen, targetlen)'을 사용한다. 그래서 필요한 문자열을 반환 할 수 없게해야한다. 더 짧은 문자열의 길이보다 많은 변경 사항. –