我有几个以下格式的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?
发布于 2014-08-28 15:28:38
我认为在这种情况下,Bool query是最好的选择。
类似于:
{
"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))
.minimumNumberShouldMatch(1)
must
部分是AND
,should
部分或多或少是OR
,除非您可以指定要匹配的最小should
数(使用minimum_should_match
),我认为这个最小值默认为1(但您可以将其设置为0,这意味着也将返回不匹配should
条件的文档)。
如果要执行涉及嵌套AND
和OR
的更复杂查询,只需在must
或should
部件中嵌套其他布尔查询即可。
此外,在寻找精确值(ids等)时,也许可以使用term queries instead of match queries,这样就省去了分析阶段(如果对这些字段进行了分析,这对于ids来说就不一定有意义了)。如果对它们进行了分析,您仍然可以这样做,但前提是您确切地知道您的术语是如何存储的(standard analyzer stores them lower cased for instance)。
发布于 2014-08-29 08:43:40
如果你使用query_string
query,你的and和OR会被Lucene库解释成这样。
这使您可以搜索
(currentUserId OR currentCustomerId) AND currentComponent
例如。默认情况下,将在所有字段中搜索值。
https://stackoverflow.com/questions/25552321
复制相似问题