2017-10-11 1 views
1

DocumentempName, empId, departmentId etc과 같이 여러 개의 필드 이름을 가진 회사의 직원 데이터입니다.여러 FuzzyQuery가있는 Lucene BooleanQuery가 너무 느림

맞춤 분석기를 사용하면 약 4 백만 개의 데이터가 색인 생성됩니다.

검색 쿼리에 listofemployees'name이 있고 목록의 모든 직원이 같은 부서에 속해 있다는 것을 알고 있습니다. 회사에 여러 부서가 있습니다.

그래서 모든 직원의 이름이 department id 인 경우 fuzzy search으로하고 싶습니다.

Query termQuery = new TermQuery(new Term("departmentId","1234")); 
BooleanQuery.Builder bld = new BooleanQuery.Builder(); 
for(String str:employeeNameList) { 
    bld.add(new FuzzyQuery(new Term("name",str)), BooleanClause.Occur.SHOULD); 
}  
BooleanQuery bq = bld.build(); 
BooleanQuery finalBooleanQeury = new BooleanQuery.Builder() 
       .add(termQuery, BooleanClause.Occur.MUST) 
       .add(bq, BooleanClause.Occur.MUST).build(); 

지금 IndexSearchersearch 방법 내부 finalBooleanQeury을 전달하고 결과를 얻는이 들어

나는 보이는 부울 쿼리를 사용하고 있습니다.

의 경우 이 너무 많아서 employeeName 목록의 크기가 more than 50 일 때 검색에 약 500 ms이 걸릴 수 있습니다.

500 ms에서 50 ms까지 시간을 줄이려면 어떻게해야합니까?

이 문제에 대한 다른 해결책이 있습니까?

+0

왜 모든 직원에 대해 부울 절을 추가하나요? – Mysterion

+0

@Mysterion이 일을하는 다른 방법이 있습니까? –

답변

1

FuzzyQuery의 다른 생성자를 살펴보면 몇 가지 쉬운 방법으로 성능을 향상시킬 수 있습니다. FuzzyQuery가 수행 할 작업량을 줄이고 성능을 향상시킬 수있는 추가 인수가 있습니다.

첫째, 가장 중요한 :

  • 접두어 길이 : 난 강력 0이 아닌 값으로 설정하는 것이 좋습니다 . 이것은 용어의 시작 부분에 얼마나 많은 문자가 이 아니며은 퍼지 매칭의 대상이됩니다. 따라서 접두사가 1 인 "abc"를 검색하면 "abb"와 "acc"는 일치하지만 "bbc"는 일치하지 않습니다. 이렇게하면 lucene이 전체 용어 사전을 스캔하지 않아도 일치하는 용어를 찾으려고 할 때 색인과 함께 작업 할 수 있습니다. 여기서 가장 큰 성능 향상을 보게 될 것입니다. 많은 사람들이 이 성능과 회의 검색 요구간에 균형을 잘 맞추는 것으로 보입니다.

가능한 인수의 나머지 부분도 도움이 될 수 있습니다

  • maxEdits를 - 2는 기본, 최대이다. 이 값을 1로 설정하면 일치가 적어 작업 속도가 빨라집니다.

  • maxExpansions -이 쿼리는 퍼지 매개 변수와 일치하는 용어를 찾은 다음 해당 용어에 대한 검색을 수행합니다. 짧은 검색어를 검색하는 경우 특히 일치하는 검색어 목록이 매우 길어질 수 있습니다. maxExpansions를 설정하면 매우 긴 일치 목록이 나타나지 않습니다. 기본값은 50입니다.

  • transpositions - 두 문자를 서로 바꿀 수 있는지 여부. 기본값은 true입니다.기본적으로 Levenshtein과 Damerau-Levenshtein의 차이점. false는 일이 적고 일치가 적기 때문에 더 잘 수행됩니다. 그 차이가 커질 지 모르겠다.

+0

답변을 주셔서 감사합니다. 이미 추가 생성자를 사용하여 다른 생성자를 살펴 보았습니다. 그러나 논쟁을 설정하는 데 몇 가지 제한이 있습니다. ** 접두어 길이 ** : 색인 생성 중에 ** DoubleMetaphoneFilter **를 사용하므로 접두사 길이를 고정하면 결과가 변경 될 수 있습니다. ** maxEdits ** : 직원 이름이 1보다 큰 맞춤법 오류가있을 수 있으며 maxEdits를 1로 변경할 수 없습니다. ** maxExpansions ** :이 방법이 도움이되는 경우는 드뭅니다. ** transpositions ** : 이것은 또한 도움이 될 수 있지만 문자를 바꿀 필요없이 예상되는 퍼지 결과를 얻지는 못합니다. –