我有几个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?
3条答案
按热度按时间dxpyg8gm1#
我认为在这种情况下,Bool query是最好的镜头。
类似于:
在Java中:
must
部分是AND
s,should
部分或多或少是OR
s,除了您可以指定要匹配的should
s的最小数量(使用minimum_should_match
),我认为默认情况下最小值为1(但您可以将其设置为0,这意味着也将返回不匹配should
条件的文档)。如果您想执行涉及嵌套
AND
s和OR
s的更复杂的查询,只需在must
或should
部分中嵌套其他bool查询。另外,当你在寻找精确的值(id等)时,也许你可以使用term queries instead of match queries,这样可以省去分析阶段(如果这些字段被分析的话,这对id来说不一定有意义)。如果它们被分析,你仍然可以这样做,但只有当你确切地知道你的术语是如何存储的(例如,标准分析器存储它们的小写)。
xxhby3vn2#
如果你使用
query_string
query,你的AND和OR将被Lucene库解释为这样。这允许您搜索
比如说默认情况下,将在所有字段中搜索值。
kmynzznz3#
下面是一个使用AND、OR和NOT的查询示例:
它只在指定的城市中搜索城市,其中描述包括(“伟大”和“橙子”)或“流行”词,但不包括结果,其中“穷人”词找到
must
表示AND,should
表示OR,must_not
表示NOT您可以找到here的其他示例: