es QueryBuilders

这篇具有很好参考价值的文章主要介绍了es QueryBuilders。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本查询
先来熟QueryBuilders这个类封装的基本查询

QueryBuilders.matchQuery() 会根据分词器进行分词,分词之后去查询
QueryBuilders.termQuery() 不会进行分词,且完全等于才会匹配
QueryBuilders.termsQuery() 一个字段匹配多个值,where name = ‘A’ or name = ‘B’
QueryBuilders.multiMatchQuery() 会分词 一个值对应多个字段 where username = ‘zs’ or password = ‘zs’
QueryBuilders.matchPhraseQuery() 不会分词,当成一个整体去匹配,相当于 %like%
如果想使用一个字段匹配多个值,并且这多个值是and关系,如下 要求查询的数据中必须包含北京‘和’天津QueryBuilders.matchQuery(“address”,“北京 天津”).operator(Operator.AND)
如果想使用一个字段匹配多个值,并且这多个值是or关系,如下 要求查询的数据中必须包含北京‘或’天津
QueryBuilders.matchQuery(“address”,“北京 天津”).operator(Operator.OR)
复合查询
通常都是将多个查询条件组合在一起,常用的有must、must_not、should

测试数据
有这样一段测试数据
      {"address":"鸿星尔克0","codes":"中国人民银行0","id":0,"name":"平安富士康0"}
     {"address":"鸿星尔克1","codes":"中国人民银行1","id":1,"name":"平安富士康1"}
     {"address":"鸿星尔克2","codes":"中国人民银行2","id":2,"name":"平安富士康2"}
     {"address":"鸿星尔克3","codes":"中国人民银行3","id":3,"name":"平安富士康3"}
     {"address":"鸿星尔克4","codes":"中国人民银行4","id":4,"name":"平安富士康4"}
     {"address":"汽车家族0","id":0,"name":"快递收货0"}
     {"address":"汽车家族1","id":1,"name":"快递收货1"}
     {"address":"汽车家族2","id":2,"name":"快递收货2"}
     {"address":"汽车家族3","id":3,"name":"快递收货3"}
     {"address":"汽车家族4","id":4,"name":"快递收货4"}
     {"address":"新鲜水果-徐鲸鱼0","id":0,"name":"东方不败0"}
     {"address":"新鲜水果-徐鲸鱼1","id":1,"name":"东方不败1"}
     {"address":"新鲜水果-徐鲸鱼2","id":2,"name":"东方不败2"}
     {"address":"新鲜水果-徐鲸鱼3","id":3,"name":"东方不败3"}
     {"address":"新鲜水果-徐鲸鱼4","id":4,"name":"东方不败4"}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查询1:查询address 必须包含’汽车’ 或者’水果’的,查询id必须不能包含’2’和’0’的。
此时需要构造两个条件,类似mysql中的 where (address like %汽车% or
address like %水果% ) and (id != 1 or id != 2)
    @Test
    public void testBoolQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR));
        boolQuery.mustNot(QueryBuilders.termsQuery("id","0","2"));
        searchSourceBuilder.query(boolQuery);

        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
        for (SearchHit documentFields : search.getHits().getHits()) {
            System.out.println(documentFields.getScore() + ":::"  +documentFields.getSourceAsString());
        }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看日志打印

为什么address中包含汽车的得分高于包含水果的,因为包含汽车的address字段的值有5个字符,包含水果的address字段值包含9个字符,字符越少的,得分越高。

之前在must条件中是这么写的

后来发现一直查不到数据,发现这样写不对,我们查询需求是:address必须包含‘汽车’或者‘水果的’,但如果这样写的话就成了address中既要匹配‘水果’又要匹配,显然没有哪个address字段值既包含水果又包含汽车的,所以查询不到。

查询2:查询address 必须包含’汽车’ 或者’水果’的,查询id必须不能包含’2’和’0’的。name最好是包含 '东方’的。这个最好包含是有最好,没有也无所谓,此时需要用should来封装。
    @Test
    public void testBoolQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR));
        boolQuery.mustNot(QueryBuilders.termsQuery("id","0","2"));
        boolQuery.should(QueryBuilders.matchQuery("name","东方"));
        searchSourceBuilder.query(boolQuery);
        
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
        for (SearchHit documentFields : search.getHits().getHits()) {
            System.out.println(documentFields.getScore() + ":::"  +documentFields.getSourceAsString());
        }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看日志

此时,在should中指定的条件name中包含东方的,分数就提高了。

如果我们将must条件修改为一下,则还是会查询不到数据,因为没有一条文档的address包含‘汽车’或‘水果’同时codes包含‘中国’


复合查询嵌套
boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR));
1
在复合查询时,我们使用must构建了 address必须包含‘汽车’或‘水果’的查询条件,但我们也可以给这个must再嵌套一个布尔查询,这个bool查询应该是一个should关系,如下

    private BoolQueryBuilder buildBoolQuery(){
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(QueryBuilders.matchQuery("address","水果"));
        boolQueryBuilder.should(QueryBuilders.matchQuery("address","汽车"));
        return boolQueryBuilder;
    }
1
2
3
4
5
6
修改must构造即可。

————————————————
版权声明:本文为CSDN博主「DanceDonkey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43750656/article/details/112002929文章来源地址https://www.toymoban.com/news/detail-427842.html

到了这里,关于es QueryBuilders的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ElasticSearch笔记】ES基本查询

    目录 一、简介 ES与关系型数据库对比 文本分析 倒排索引 二、基本查询 空查询 相关性 查询与过滤 1. 查询与\\\"first blog\\\"字段最佳匹配的文档 2. 搜索博客等级(level)大于等于2, 同时发布日期(post_date)是2018-11-11的博客 结构化搜索 1. 精确值查找(term) 2. 多个精确值查找(terms) 3

    2024年01月21日
    浏览(38)
  • Elasticsearch专栏-6.es基本用法-聚合查询

    在es中,所有的聚合查询都是放在aggs中进行的。平均值、总和、最大、最小、数量对应的分别是:avg、sum、max、min、value_count 分组用到的是terms 上面语句中的size:3,指的是分组后,只展示前三个分组内容。size:0,指的是所有query查询结果,也就是原始数据,不需

    2024年02月09日
    浏览(39)
  • Elasticsearch专栏-5.es基本用法-分词查询

    所谓分词,就是把一段语句,分割成一个个单词的过程。比如\\\"717 Hendrickson Place\\\"短语,分词后就是三个单词,即717、hendrickson、place。注意,分词后的单词默认都是小写。 分词查询,指的就是查询时,把要查询的语句(字符串)先进行分词,然后拿分词后的单词去文档集合中比

    2024年01月16日
    浏览(45)
  • ES基本查询语法_Kibana操作(持续更新)

    1. ES查询索引下所有的数据 2. ES单字段精确查询 3. ES多字段精确查询(默认Kibana查询最多展示10条记录,可以通过设置size来展示更多匹配到的数据) 4. ES数组字段精确查询 5. ES日期范围查询(大写HH表示24小时制) 6. 查询ES索引下的数据量 7. 查询ES索引下的mapping关系 7. 查询E

    2024年02月11日
    浏览(66)
  • Elasticsearch基础学习-常用查询和基本的JavaAPI操作ES

    Elasticsearch是一个基于 lucene 、分布式、通过Restful方式进行交互的 近实时搜索 平台框架。 ELK技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个 开源的高扩展的分布式全文搜索引擎 , 是整个 ELK技术栈的核心。 Elasticsearch是一个基于lucene、分

    2024年02月11日
    浏览(58)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(87)
  • ES+Redis+MySQL,这个高可用架构设计

    会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。 随着同程和艺龙两家公司的合并,越来越多的系统需要

    2024年02月07日
    浏览(44)
  • ES+Redis+MySQL,这个高可用架构设计太顶了

       一、背景 二、ES高可用方案 三、会员Redis缓存方案 四、高可用会员主库方案 五、异常会员关系治理 六、展望:更精细化的流控和降级策略    会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是

    2024年02月05日
    浏览(68)
  • 熬夜搞了 17000 字,终于把你这个 ES 玩明白了

    平常经常用ES(ElasticSearch), 觉得这真是个好玩意儿,所以来分享一篇文章,希望通过这篇文章能让读者大致了解ES是做什么的以及它的使用和基本原理。 可能有的读者航海不知道ES是个啥玩儿,别着急,看完本文后,相信你会了解ES, 对ES的理解也会更加深刻。希望大家在合适的

    2024年02月10日
    浏览(42)
  • 【ES】search_phase_execution_exception 出现这个异常的可能情况

    search_phase_execution_exception是Elasticsearch搜索期间可能出现的异常类型之一。当发生搜索期间的错误或异常时,Elasticsearch可能会抛出search_phase_execution_exception异常。下面列出了一些可能导致此异常的情况: 解析错误:如果您的搜索查询无法被正确解析,Elasticsearch可能会抛出sear

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包