2012-08-01 6 views
4

루씬은 기본적으로하지 않습니다 수 있도록 검색어에서 최고의 와일드 카드, but this can be enabled과 :이해 루씬 선도 와일드 카드 성능

QueryParser#setAllowLeadingWildcard(true) 

내가 선도적 인 와일드 카드의 사용이 인덱스를 사용 루씬을 방지 이해합니다. 선행 와일드 카드로 검색하면 전체 색인을 검색해야합니다.

와일드 카드 쿼리의 성능을 어떻게 보여줄 수 있습니까? setAllowLeadingWildcard(true)을 언제 사용할 수 있습니까?

{ name: random_3_word_phrase } 

인덱스는 디스크에 360M입니다 :

나는 형태로 천만 문서와 테스트 인덱스를 구축했다.

테스트 쿼리 성능이 뛰어나고 성능 문제를 실제로 보여줄 수 없었습니다. 예를 들어 name:*ing을 쿼리하면 1 초 이내에 110 만 개가 넘는 문서가 생성됩니다. 쿼리 name:*ing*은 동시에 150 만 개가 넘는 문서를 생성합니다.

여기가 어떻게됩니까? 왜 이렇게 느리지 않니? 10,000,000 개의 문서로 충분하지 않습니까? 문서가 단일 필드 이상을 포함해야합니까?

+0

더 큰 색인이 필요합니다. 위키 피 디아 데이터 세트를 다운로드하고 인덱싱을 시도한 다음 다시 테스트 해보십시오. – GalacticJello

+0

@GalacticJello 더 많은 문서 에서처럼? 문서 당 더 많은 필드가 있습니까? 긴 필드? –

+2

당신은 lucene의 버전을 언급하지 않았습니다. 어쩌면 당신은 이미 알고 있지만, 4.0 (현재 알파) 버전에는 와일드 카드 검색 속도가 훨씬 빨라졌습니다. – javanna

답변

6

메모리 용량 및 메모리에있는 토큰 인덱스의 양에 따라 다릅니다.

오래된 컴퓨터에서 360MB의 전체 색인을 매우 빠르게 검색 할 수 있습니다. 360GB 색인은 조금 더 오래 걸릴 것입니다 ...;)

예를 들어 이전 2GB 색인을 실행하고 "* e"를 검색했습니다.

8GB의 상자에서 5 초 이내에 500K의 조회수를 반환했습니다. 나는 단지 1GB의 메모리만으로도 동일한 색인을 시도했고 약 20 초가 걸렸습니다.

다음은 기본적으로 "** E *"유형의 검색에서 1 천만 개의 임의의 3 단어 구문을 검색하는 일반적인 C# 코드입니다. "var에 = index.FindAll (SubstringPredicate)과 일치;"모든 10000000 단계가 목록에로드 된 후

static string substring = "E"; 

private static Random random = new Random((int)DateTime.Now.Ticks);//thanks to McAden 

private static string RandomString(int size) 
{ 
    StringBuilder builder = new StringBuilder(); 
    char ch; 
    for (int i = 0; i < size; i++) 
    { 
     ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
     builder.Append(ch); 
    } 

    return builder.ToString(); 
} 

static void FindSubStringInPhrases() 
{ 
    List<string> index = new List<string>(); 

    for (int i = 0; i < 10000000; i++) 
    { 
     index.Add(RandomString(5) + " " + RandomString(5) + " " + RandomString(5)); 
    } 

    var matches = index.FindAll(SubstringPredicate); 

} 

static bool SubstringPredicate(string item) 
{ 
    if (item.Contains(substring)) 
     return true; 
    else 
     return false; 
} 

, 그것은 여전히위한 초 정도 걸립니다 4 백만 건 이상의 조회수를 기록했습니다.

요점은 메모리가 빠릅니다. 일들이 더 이상 메모리에 맞지 않아 디스크로 스와핑을 시작하면 성능이 저하 될 것입니다.

1

올바르게 이해하면 색인의 일부는 색인 된 용어의 정렬 된 목록 인 용어 사전입니다. 와일드 카드 나 후행 와일드 카드없이 검색 할 때 Lucene은 많은 용어에 공통 접두어가 있다는 사실을 이용할 수 있습니다. 한편, 대표적인 와일드 카드로 검색하면 전체 용어 사전을 검색합니다. 이것은 최적은 아니지만 용어 사전은 빈도 및 위치 데이터와 같이 색인의 다른 부분에 비해 작기 때문에 용어 사전의 전체 스캔은 일반적으로 큰 문제가 아닙니다.