文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaES(Elasticsearch)中的and和or查询

2022-11-13 19:30

关注

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

//跨索引查询

SearchRequest request = new SearchRequest(index1,index2);

在es中想实现类似于下面的查询,废话不多说,es的should查询代替的是or,但是必须搭配must来使用

select * from table where (a != 1 and b != 1) or (startTime> “2022-05-20” and (a == 1 or b == 1)) 

直接上代码

@Autowired
    private RestHighLevelClient client;
 public List<Map<String,Object>> searchList(String index1,String index2,Map<String,Object> paramMap
            ,String time,int page,int size) {
        List<Map<String,Object>> hitList = new ArrayList();
        try {
            //搜索请求
            SearchRequest request = new SearchRequest(index1,index2);
            //请求条件构建器,这里和mybatis中的自定义查询有点类型
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            //等于条件(其他的一些条件)
            if (paramMap != null && !paramMap.isEmpty()) {
                paramMap.forEach((k, v) -> {
                    boolQueryBuilder.must(QueryBuilders.termsQuery(k + KEYWORD, v));
                });
            }
                BoolQueryBuilder query1 = QueryBuilders.boolQuery();
                query1.mustNot(QueryBuilders.termsQuery("a" + ".keyword", "1"));
                query1.mustNot(QueryBuilders.termsQuery("b" + ".keyword", "1"));

                BoolQueryBuilder query2 = QueryBuilders.boolQuery();
                //时间范围查询
                if (StringUtils.isNotBlank(time)) {
                    query2.must(QueryBuilders.rangeQuery("startTime"+KEYWORD).from(time));
                }

                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
                shouldQuery.should(QueryBuilders.wildcardQuery("a" , "1"));
                shouldQuery.should(QueryBuilders.wildcardQuery("b" , "1"));
                query2.must(shouldQuery);

                BoolQueryBuilder query3 = QueryBuilders.boolQuery();
                query3.should(query1);
                query3.should(query2);
                boolQueryBuilder.must(query3);

            //把查询添加放入请求中
            sourceBuilder.query(boolQueryBuilder);
            request.source(sourceBuilder);
            //起始位置
            sourceBuilder.from((page - 1) * size);
            //查询数量
            sourceBuilder.size(size);
            sourceBuilder.trackTotalHits(true);
            //建立SearchResponse
            SearchResponse response;

            response = client.search(request, RequestOptions.DEFAULT);
            //封装查询的信息
            for (SearchHit hit : response.getHits().getHits()) {
                hitList.add(hit.getSourceAsMap());
                log.debug("查询结果:{}", hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return hitList;
    }

将每一块拆成一个BoolQueryBuilder ,最后or用should()拼接起来

ElasticSearch(es) match or,and查询

es中match查询中,查询字符串分词后,默认是or或者的关系。

语法

operator:用来控制match查询匹配词条的逻辑条件,默认值是or,如果设置为and,表示查询满足所有条件

minimum_should_match:当operator参数设置为or时,该参数用来控制应该匹配的分词的最少数量。

当参数operator使用默认值时,参数minimum_should_match设置每个子查询应该匹配多少个分词,默认值是1,例如,设置minimum_should_match为1,那么搜索的字段中至少含有一个分词。

match or实例

GET /bank/_search
{
  "from":1,
  "size":5,
  "query": {
    "match": {
      "smsContent": {
        "query": "java 学习",
        "operator": "or" //或者关系
        "minimum_should_match": 2
      }
    }
  }
}

smsContent中包含java或者学习的内容,minimum_should_match等于2表示这2个分词在内容中必须大于2次

match and实例

GET /bank/_search
{
  "query": {
    "match": {
      "smsContent": {
        "query": "java 学习",
        "operator": "and" //并且关系
      }
    }
  }
}

到此这篇关于ES 中的and 和 or 查询的文章就介绍到这了,更多相关ES 中的and 和 or 查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯