2009-10-23 4 views
0

최근에 Lucene (특히 Lucene.Net)과 작업을 시작했으며 여러 가지 색인을 성공적으로 만들었으며 그 중 일부에 문제가 없습니다. 이전에 Endeca와 함께 작업 한 결과, Lucene은 가볍고 강력하며 학습 곡선이 거의 없음을 알았습니다 (주로 간결한 API 덕분에).Lucene 색인 및 질문 설계 질문 - 사람들 검색

그러나 특정 인덱스/쿼리 상황에서 머리를 감싸는 데 문제가 있습니다. 내가 가지고있는 것은 사람 디렉토리 다. 정확한 일치 및 근사 일치를 모두 목표로하여이 애플리케이션에서 사람들을 검색 할 수 있습니다. 지금은 인덱스에서 "FirstName"과 "LastName"을 "FullName"이라는 단일 필드에 연결하여 둘 사이에 공백을 추가합니다. 그래서 성 (FirstName) : Jon과 성 : Smith는 FullName : Jon Smith를 산출합니다. 중간 이름과 접미사의 가능성을 예상하지만, 현재로서는 중요하지 않습니다.

나는 "John Smith"를 검색하는 누군가가 여전히 "Jon Smith"를 찾을 수 있도록 이름에 퍼지 검색과 동일한 작업을 수행하려고합니다. 나는 multisearch에 대해 생각해 보았지만 그의 이름이 실제로 "Jon Del Carmen"또는 "Jon Paul Del Carmen"인 경우에는 더 복잡해졌습니다. 나는 사용자가 성 또는 이름 부분을 묘사하기 위해 입력하는 것에는 아무 것도 없다.

내가 가지고있는 유일한 생각은 연결된 값의 공백을 버리지 않을 문자로 바꿀 수 있다는 것입니다. 인덱스에 대한 문서를 만들 때 쿼리를 구문 분석 할 때도 이렇게하면 쿼리를 하나의 큰 단어로 처리 할 수 ​​있습니다. 간단한 이름 ("Jon Smith")과 더 복잡한 이름 ("Jon Paul Del Carmen") 모두에 적용되는 다른 방법이 있습니까?

모든 조언은 진심으로 감사하겠습니다. 미리 감사드립니다!

편집 : 추가 세부 사항이 있습니다.

FullName:jonn smith~ 
그것은으로 해석되는

:의 설명과 함께

FullName:jonn CreatedOn:smith~0.5 

:

BooleanQuery:boost=1.0000 
    clauses=2, maxClauses=1024 
    Clause 0: SHOULD 
     TermQuery:boost=1.0000 
      Term: field='FullName' text='jonn' 
    Cluase 1: SHOULD 
     FuzzyQuery: boost=1.0000 
      prefixLen=0, minSimilarity=0.5000 
      org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000 
      FilteredTermEnum: Exception null 

"CreatedOn"

는 누가 복음에서, 나는 다음과 같은 쿼리에 넣어 인덱스의 다른 필드입니다. 나는 "jonn smith"라는 용어를 따옴표로 묶으려고 시도했지만 대신 문구처럼 취급합니다. 나는 그 문제가 내가 옳은 일을하고있는 것이 아니라는 것을 확신하지만,이 모든 것에서 매우 초록색인데, 나는 그 무엇이 진정으로 무엇인지 확신 할 수 없다.

+0

나는 약간 혼란 스럽다. 이것은 꽤 간단한 쿼리와 같습니다. 그 이름이 2 개 또는 10 개라면 무엇이 중요할까요? 퍼지 쿼리 및/또는 스팬 쿼리가 이름에 가까워지면 결과로 반환됩니다. – Gandalf

+0

Luke를 사용하거나 코드에서 실행하는 경우 FullName : John Smith ~와 같은 것이 "John"을 사용하고 공간 이후의 모든 것을 버리는 것입니다. 내 메시지에 설명을 포함 시켜서 분명히 빠진 것이 있는지 확인할 수 있습니다. –

+0

다음과 같은 쿼리를 수행해야하는 제 문제는 무엇입니까? FullName : john \ smith ~? 공간을 벗어나면 공간이 올바르게 교정되는 것 같습니다. –

답변

0

색인을 작성하는 방법에 문제가있었습니다. 필자는 결국 FullName을 토큰 화하지 않고 쿼리가 올바른 결과를 반환하기 시작했는지 확인했습니다. 위에서 설명한 Explain 결과는 내 부품의 ID10T 오류로 인한 것이므로 이제는 올바르게 반환됩니다.