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
将被返回)。
如果您想要执行涉及嵌套AND
和OR
的更复杂查询,只需将其他bool查询嵌套在must
或should
部分内。
此外,当您正在寻找确切的值(ids等)时,也许您可以使用术语查询而不是匹配查询 ,这将使您免于分析阶段(如果这些字段完全被分析,这不一定有意义ids)。 如果对它们进行分析,您仍然可以这样做,但前提是您确切知道如何存储条款(例如, 标准分析仪将它们存储得较低 )。
如果使用query_string
查询 ,则Lucene库将对AND和OR进行解释。
这允许您搜索
(currentUserId OR currentCustomerId) AND currentComponent
例如。 默认情况下,将在所有字段中搜索值。