Elasticsearch查询中的OR和AND运算符

我的json文档很少,格式如下: –

_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?

我认为在这种情况下, Bool查询是最佳镜头。

就像是 :

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

这给出了Java:

 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 s, should部分或多或少是OR ,除了你可以指定匹配的最小数量minimum_should_match (使用minimum_should_match ),我认为这个最小值是1(但你可以设置为0,表示将返回匹配no条件的文档should将被返回)。

如果您想要执行涉及嵌套ANDOR的更复杂查询,只需将其他bool查询嵌套在mustshould部分内。

此外,当您正在寻找确切的值(ids等)时,也许您可​​以使用术语查询而不是匹配查询 ,这将使您免于分析阶段(如果这些字段完全被分析,这不一定有意义ids)。 如果对它们进行分析,您仍然可以这样做,但前提是您确切知道如何存储条款(例如, 标准分析仪将它们存储得较低 )。

如果使用query_string查询 ,则Lucene库将对AND和OR进行解释。

这允许您搜索

 (currentUserId OR currentCustomerId) AND currentComponent 

例如。 默认情况下,将在所有字段中搜索值。