Java中Elasticsearch使用类似MySQL的OR和AND查询

本文用实例来介绍如何使用Spring Data Elasticsearch的ElasticsearchRestTemplate来操作ES,在Java中Elasticsearch使用类似MySQL的OR和AND进行多条件查询。

官网

Elasticsearch Operations

bool query:

一种复合查询,把其余类型的查询包裹进来,支持以下三种逻辑关系。

java 复制代码
must: AND   
must_not:NOT
should:OR

ES查询实例如下:

javascript 复制代码
{
    "bool" : {
        "must" : { "term" : { "component" : "comp_1" } },  // must = And
        "should" : [                                       // should = Or
            { "term" : { "userId" : "A1A1" } },    
            { "term" : { "customerId" : "C1" } },
            { "term" : { "currentRole" : "ADMIN" }}
        ],
        "minimum_should_match" : 1
    }
}

在Java中代码示例:

java 复制代码
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;

org.elasticsearch.index.query.QueryBuilder qb = QueryBuilders
    .boolQuery()
    .must(termQuery("component", currentComponent))
    .should(termQuery("userId", currentUserId))
    .should(termQuery("customerId", currentCustomerId))
    .should(termQuery("currentRole", ADMIN))
    // .must(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("num", "6","8")))
    .minimumNumberShouldMatch(1);

该must部分是ANDS;

该should部分都或多或少ORS;

除了你可以指定的最小数量should(用s到比赛minimum_should_match),这个最低默认为1,我认为(但你可以将其设置为0,这意味着文件不匹配的should条件也将被返回)。

如果要进行涉及嵌套ANDs和ORs的更复杂的查询,只需将其他布尔查询嵌套在内部must或should部分中。

另外,当您寻找准确的值(id等)时,也许可以使用术语查询代替匹配查询,从而节省了分析阶段的时间(如果对这些字段进行了分析,则不一定有意义)对于ID)。如果对它们进行了分析,则您仍然可以这样做,但前提是您必须确切地知道术语的存储方式(例如,标准分析器将它们存储为小写)。

匹配关键字示例:

复制代码
// es 查询满足条件1 或满足条件2 的结果合集
//主查询
matchQuery.must(
        QueryBuilders.boolQuery()
        .should(QueryBuilders.matchQuery("xm","好的"))//分词后匹配
            .should(QueryBuilders.matchParaseQuery("addr","钱江路"))//匹配完整词
            .should(QueryBuilders.termQuery("status",0))//完全匹配
            .should(QueryBuilders.termsQuery("keyword",string[]))//多关键字匹配
            );

    SearchResponse response = client.prepareSearch("indexName")
            .setFrom(0)
            .setSize(10)
            .setQuery(matchQuery)
            .get();

    SearchHits hits = response.getHits();
    int count = (int) hits.getTotalHits();

    for(SearchHit one:hits)
    {
        //遍历结果处理
    }

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

相关推荐
炸薯条!27 分钟前
博客系统测试报告
开发语言·lua
Evand J34 分钟前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
Rain的Java大神之路38 分钟前
国家数据集团校招、社招都开了:总部雄安,这些技术岗值得认真看看
java·后端·面试
吴名氏.1 小时前
Java转AI Agent教程(第九周)错误矩阵
java·人工智能·矩阵·ai agent
文丑颜不良啊1 小时前
LeetCode1901~1920题目解析
java·leetcode
tealcwu1 小时前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
vipxieliang1 小时前
Spring Boot 性能优化实战:从启动加速到运行时调优
java·spring boot
AI全栈学习助手1 小时前
告别“转圈等待”:Spring Boot + SSE 让大模型像 ChatGPT 一样流式输出
java·人工智能·spring boot·后端·aigc
天天被压力2 小时前
【A股分钟级高频数据完全手册 #02】Python调用股票1分钟数据接口:Pro版最新分时取数与字段解析
java·人工智能·python