2014-08-28 7 views
6

나는 다음과 같은 형식으로 몇 JSON 문서를 가지고있다 -OR 및 AND 연산자는

_source: { 
      userId: "A1A1", 
      customerId: "C1", 
      component: "comp_1", 
      timestamp: 1408986553, 
    } 

나는 다음과 같은 기준으로 문서를 조회 할 : -

((userId == currentUserId) OR (customerId== currentCustomerId) OR (currentRole ==ADMIN)) AND component= currentComponent) 

내가 사용 시도를 SearchSourceBuilder 및 QueryBuilders.matchQuery를 사용했지만 AND 및 OR 연산자로 여러 하위 쿼리를 넣을 수는 없었습니다.

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
searchSourceBuilder.query(QueryBuilders.matchQuery("userId",userId)).sort("timestamp", SortOrder.DESC).size(count); 

OR 및 AND 연산자를 사용하여 elasticsearch를 쿼리하는 방법은 무엇입니까?

답변

24

이 경우에는 Bool query이 가장 좋습니다. 같은

뭔가 :

{ 
    "bool" : { 
     "must" : { "term" : { "component" : "comp_1" } }, 
     "should" : [ 
      { "term" : { "userId" : "A1A1" } }, 
      { "term" : { "customerId" : "C1" } }, 
      { "term" : { "currentRole" : "ADMIN" } } 
     ], 
     "minimum_should_match" : 1 
    } 
} 

자바에서 제공 : 당신이 최소를 지정할 수 있다는 점을 제외

QueryBuilder qb = QueryBuilders 
    .boolQuery() 
    .must(termQuery("component", currentComponent)) 
    .should(termQuery("userId", currentUserId)) 
    .should(termQuery("customerId", currentCustomerId)) 
    .should(termQuery("currentRole", ADMIN)) 
    .minimumShouldMatch("1"); // or .minimumNumberShouldMatch(1) 

must 부품 AND의이는 should 부분은 다소 OR들입니다 (minimum_should_match을 사용하여) should이 일치해야합니다.이 최소값은 기본적으로 1입니다.하지만 0으로 설정할 수 있습니다. 즉, should 조건도 반환됩니다).

더 복잡한 쿼리가 AND들과 OR의, must 또는 should 부품 내부 단순히 둥지 다른 부울 쿼리를 중첩 포함하고 싶은 경우

.

정확한 값 (ID 등)을 찾으려면 term queries instead of match queries을 사용할 수 있습니다. 분석 단계를 생략 할 수 있습니다 (해당 필드가 전혀 분석되지 않는 경우). ids). 분석 된 경우에도 용어를 정확하게 저장하는 방법을 알고있는 경우에만 (standard analyzer stores them lower cased for instance)이를 수행 할 수 있습니다.

+0

'.minimumShouldMatch'는 인수로만 문자열을 가져옵니다. 맞습니까? – BairDev

+0

@malte 네 말이 맞아. 이 경우에는'int'를 갖는'minimumNumberShouldMatch' 또는'string'을 갖는'minimumShouldMatch'이어야합니다. 수정 됨. –

+0

나는 이것이 받아 들여진 대답이어야한다고 생각한다. +1 – NickGreen

2

query_string query을 사용하는 경우 AND 및 OR은 Lucene 라이브러리 에서처럼 해석됩니다.

이것은 예를 들어

(currentUserId OR currentCustomerId) AND currentComponent 

를 검색 할 수 있습니다. 기본적으로 값은 모든 필드에서 검색됩니다.

+0

"QueryBuilders.queryString ("(userId : "+ currentUserId +"OR customerId : "+ currentCustomerId +"또는 currentRole : "+ ADMIN +") 및 구성 요소 : "+ currentComponent +") ")'는 의도 한대로 작동해야합니다 . –

+0

ElasticSearch 문서의 링크 된 페이지에서 : "접두어 필드가 지정되지 않은 경우 쿼리 용어의 기본 필드. 기본값은 index.query.default_field 인덱스 설정으로, 기본값은 _all입니다." ElasticSearch는 인덱스 시간에 _all 필드를 추가합니다.이 필드에 Lucene 구문을 적용 할 수 있습니다. –