2012-01-11 2 views
1

에 나는 10 개 필드가있는 데이터베이스를 가지고 있고, 나는 다음과 같은 의사 코드 같은 것을 보이는 쿼리를 구성해야합니다입니다루씬 : 부울 OR MultiFieldQueryParser

theQuery = ((field1 == A) && 
      (field2 == B) && 
      (field3 == C) && 
      (field4 == D) && 
      (field5 == E) && 
      (field6 == F) && 
      (field7 == G) && 
      ((field8 == H) || (field9 == H) || (field10 == H))) 

내가 필드 1이 필요하다고 말할를 7에 해당 공급 된 변수 인, 이 있어야합니다. 에 변수 H가 필요합니다. 확실히이 필드 8-10 중 하나에 나타납니다.

MultiFieldQueryParser를 사용하려고했지만, 제공된 BooleanClauses가 MUST_NOT 및 SHOULD이며, MultiFieldQueryParser의 기본 연산자를 AND 또는 OR로 설정할 수 있습니다.

AND를 사용하여 필드 1-7을 반드시 사용해야하고 필드 8-10을 SHOULD로 설정하면 쿼리 파서는 기본적으로 필드 8-10을 무시하고 1-7 필드에 지정된 데이터가있는 항목을 다시 제공합니다.

기본 연산자를 OR로 설정하지 않았습니다. 하나 이상의 제공된 1-10 필드에 제공된 변수 중 하나 이상을 포함하는 결과가 쿼리에서 반환되기 때문에 OR 연산자를 설정하지 않았습니다. 다음과 같이 코드를 볼하려는 사람들을 위해

, 내 코드는 다음과 같습니다 분명히이 다소 깔끔하게 나에게 문자열과 BooleanClause.Occurs의 배열을 반환하지 않는 ArrayLists로 단순화

ArrayList queries = new ArrayList(); 
ArrayList fields = new ArrayList(); 
ArrayList flags = new ArrayList(); 

if(varA != null && !varA.equals("")) 
{ 
    queries.Add(varA); 
    fields.Add("field1"); 
    flags.Add(BooleanClause.Occur.Must); 
} 
//... The same for 2-7 
if(varH != null && !varH.equals("")) 
{ 
    queries.Add(varA); 
    queries.Add(varA); 
    queries.Add(varA); 
    fields.Add("field8"); 
    fields.Add("field9"); 
    fields.Add("field10"); 
    flags.Add(BooleanClause.Occur.Should); 
    flags.Add(BooleanClause.Occur.Should); 
    flags.Add(BooleanClause.Occur.Should); 
} 
Query q = MultiFieldQueryParser.parse(VERSION.LUCENE_34, 
             queries.toArray(), 
             fields.toArray(), 
             flags.toArray(), 
             theAnalyzer); 

,하지만 당신은 얻을 아이디어.

부울 AND AND 부울 OR을 모두 포함하여 다중 필드 쿼리를 작성하는 방법을 아는 사람이 있습니까?

덕분에, 릭

답변

0

은 정말 당신의 표기법을 이해하지 못하는, 그래서 문제가 무엇인지 파악하기 어렵다.

BooleanQuery topQuery = new BooleanQuery(); 
topQuery.add(new TermQuery(...), BooleanClause.Occur.Must); 
etc. 

아니면 그냥 텍스트로 그것을 파서 당신을 위해 그것을 분석하자 :하지만 단지 표준 쿼리를 사용 +field1:A +field2:B ...

+0

을 문제는 내가 일반적인 쿼리를 형성하는 방법을 알고하지 않는 것이 아니다는 문제는 부울 AND와 반대로 부울 OR을 수행하는 방법입니다. 위에서 사용하는 MUST 표기법은 부울 AND와 유사하지만 SHOULD 표기법은 반드시 부울 OR과 유사하지 않습니다. – RikSaunderson

+1

@RikSaunderson : 반드시 AND와 같지 않아야하며, OR과 동일하지 않아야합니다. 그들은 똑같은 표현력을 가지고 있습니다. 귀하의 질의는 단지'+ field1 : A ... + field7 : G + (field8 : H field9 : I ...)'입니다. – Xodarap