2014-02-09 6 views
0

저는 꽤 큰 인덱스와 매우 높은 쿼리 빈도를 가지고 있습니다. 내가 두 쿼리가 동일하거나 하나가 그들에게 실행없이 다른 의 하위 쿼리입니다 있는지 확인 할 SOLR 요청의 수를 줄이기 위해두 개의 쿼리가 같은지 확인하십시오.

예를를 들어

! 재미와 금요일 == 금요일과 재미 = 재미 또는 금요일

재미는

등 모든 아이디어를 재미 *의 하위 쿼리입니까? 분석기 또는 smth와 메가 바이트?

건배

+0

그냥 클리어하기 :'Fun and Friday'는'Friday and Fun'과 같은가요? 나는 관련성에 관해 묻고있다. 일반적으로 Solr은 검색의 첫 번째 단어를 두 번째 단어보다 더 중요하게 취급합니다. 따라서 첫 번째 검색은 'Fun'과 관련이있는 상위 문서와 'Friday'와 관련된 다른 문서를 포함합니다 ... – cheffe

+0

일반적으로 적합하지만 업계에서 관련성은 일반적으로 무시됩니다. matter – Windys

답변

0

당신은 평등에 대한 분석 쿼리 개체를 비교할 수 있습니다. 부울 절의 순서를 무시하려면 해당 비교기를 지정해야합니다. 같은 방식으로 쿼리가 다른 쿼리의 하위 쿼리인지 여부를 확인할 수 있어야합니다. 나는 당신이 가지고있는 것과 정확히 똑같은 이유로 잠시 전에 이것을했다.

public boolean areEqualsOrderNotImportant(Query q1, Query q2) { 
    if((q1 instanceof BooleanQuery) && (q2 instanceof BooleanQuery)) { 
     BooleanQuery bq1 = (BooleanQuery)q1; 
     BooleanQuery bq2 = (BooleanQuery)q2; 
     if(bq1.getClauses().length!=bq2.getClauses().length) { 
      return false; 
     } 
     for(BooleanClause clause: bq1.getClauses()) { //multiple occurence of same clause not handled 
      if(!contains(bq2.getClauses(), clause)){ 
       return false; 
      } 
     } 
     return true; 
    }else { 
     return q1.equals(q2); 
    } 
} 
+0

그 코드를 예로들 수 있습니까? – Windys

+0

정확히 무엇 때문에? 전체 기능에 대한 코드가 너무 많습니다. – fatih

+0

쿼리 비교를 위해? – Windys

0

이 처리하는 일반적인 방법은 두 항목을 (표준 순서에 넣어) 정상화하는 것입니다 조항의 순서가 중요하지 않은 경우 다음

쿼리를 비교하기위한 작은 샘플 코드 비교를 수행하십시오 (예 : 2 파일 정렬, 정렬 된 파일 비교).

경우에 따라 쿼리를 구문 분석하고 표준 순서로 입력 한 다음 비교를 수행해야합니다. Lucene 내에서 어떤 도움이 될지 모르겠다.

관련 문제