2009-11-19 4 views
1

현재 Lucene.NET 전체 텍스트 검색 구현을하고 있습니다. 대부분의 경우 잘 진행되고 있지만 데이터의 두문자어를 중심으로 몇 가지 문제가 있습니다 ...Lucene.NET의 두문자어 검색에 문제가 발생했습니다.

예를 들어 "N.A.S.A." 나는 색인을 붙인 필드에서 그것을 n.a.s.a와 일치시킬 수 있습니다. 또는 nasa이지만 n.a.s.a는 일치하지 않습니다. 퍼지 검색 (n.a.s.a ~)을 입력하더라도 일치하지 않습니다.

나를 생각할 때 가장 먼저 떠오르는 생각은 색인 생성/검색 전에 모든..을 찢어 버리는 것입니다. 그러나 해결책보다 조금 더 해결 방법이있는 것으로 보이며 깨끗한 해결책을 얻고 싶습니다.

누구나이 종류의 데이터를 검색하는 데 더 적합한 다른 변경 또는 다른 분석기 (현재 StandardAnalyzer 사용)를 제안 할 수 있습니까?

답변

1

StandardAnalyzer은 'N.A.S.A.'를 토큰 화하는 StandardTokenizer을 사용합니다. 'nasa'로 표시하지만 'N.A.S.A'에는 표시하지 않습니다. 이것이 원본 쿼리가 'nasa'로 처리되는 입력 'N.A.S.A'와 이미 토큰 화 된 값과 일치하는 'nasa'입력과 일치하는 이유입니다. 이것은 인덱스가 'nasa'토큰 만 포함하고 있기 때문에 'N.A.S.A'가 어떤 것과도 일치하지 않는 이유를 설명합니다.

토큰 스트림에서 값을 직접 출력 할 때 볼 수 있습니다.

public static void Main(string[] args) { 
    var analyzer = new StandardAnalyzer(Version.LUCENE_30); 
    var stream = analyzer.TokenStream("f", new StringReader("N.A.S.A. N.A.S.A")); 

    var termAttr = stream.GetAttribute<ITermAttribute>(); 
    while (stream.IncrementToken()) { 
     Console.WriteLine(termAttr.Term); 
    } 

    Console.ReadLine(); 
} 

출력은 :

nasa 
n.a.s.a 

당신은 아마이 시나리오를 처리 할 수있는 사용자 정의 분석기를 작성해야합니다. 한 가지 해결책은 n.a *가 작동하도록 원래 토큰을 유지하는 것이지만 더 나은 두문자어 검색을 작성해야 할 수도 있습니다.

관련 문제