Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Elasticsearch查询中的OR和and运算符

Elasticsearch查询中的OR和and运算符
EN

Stack Overflow用户
提问于 2014-08-28 15:13:34
回答 2查看 35K关注 0票数 18

我有几个以下格式的json文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    _source: {
            userId: "A1A1",
            customerId: "C1",
            component: "comp_1",
            timestamp: 1408986553,
     }

我想根据以下内容查询文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(( userId == currentUserId) OR ( customerId== currentCustomerId) OR (currentRole ==ADMIN) )  AND component= currentComponent)

我尝试使用SearchSourceBuilder和QueryBuilders.matchQuery,但我无法使用and和OR运算符放置多个子查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("userId",userId)).sort("timestamp", SortOrder.DESC).size(count);

如何使用OR和and运算符查询elasticsearch?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 15:28:38

我认为在这种情况下,Bool query是最好的选择。

类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "bool" : {
        "must" : { "term" : { "component" : "comp_1" } },
        "should" : [
            { "term" : { "userId" : "A1A1" } },
            { "term" : { "customerId" : "C1" } },
            { "term" : { "currentRole" : "ADMIN" } }
        ],
        "minimum_should_match" : 1
    }
}

它在Java中给出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QueryBuilder qb = QueryBuilders
    .boolQuery()
    .must(termQuery("component", currentComponent))
    .should(termQuery("userId", currentUserId))
    .should(termQuery("customerId", currentCustomerId))
    .should(termQuery("currentRole", ADMIN))
    .minimumNumberShouldMatch(1)

must部分是ANDshould部分或多或少是OR,除非您可以指定要匹配的最小should数(使用minimum_should_match),我认为这个最小值默认为1(但您可以将其设置为0,这意味着也将返回不匹配should条件的文档)。

如果要执行涉及嵌套ANDOR的更复杂查询,只需在mustshould部件中嵌套其他布尔查询即可。

此外,在寻找精确值(ids等)时,也许可以使用term queries instead of match queries,这样就省去了分析阶段(如果对这些字段进行了分析,这对于ids来说就不一定有意义了)。如果对它们进行了分析,您仍然可以这样做,但前提是您确切地知道您的术语是如何存储的(standard analyzer stores them lower cased for instance)。

票数 44
EN

Stack Overflow用户

发布于 2014-08-29 08:43:40

如果你使用query_string query,你的and和OR会被Lucene库解释成这样。

这使您可以搜索

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(currentUserId OR currentCustomerId) AND currentComponent

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25552321

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文