java-es查询

2023-10-26

目录

1、检索ES数据库

2、检索下级数据

3-1、检索多个字段,匹配同一个值

 3-2、.must()

 3-3、.should()

3-3-1、.should()--一个key多个value

4、java中匹配ES中多个字段查询(为什么加上.keyword反而无结果了呢?)

5-1、检索ES数据库--未超过1W条

5-2、检索ES数据库--超过1W条,可以通过分页查询实现

6、检索字段排序-NativeSearchQueryBuilder 

7、聚合检索ES-某个字段下所有的值(去重)

方法一:聚合

方法二:Collapse

8、自定义检索

9、Cardinality去重

10、filter与query比较


1、检索ES数据库

    /**
     * @Description: 通过企业类型查询企业名称
     * @MethodName: queryOrgNameByEnterprisesType
     * @Param enterprisesType: 企业类型(例如:研究所/学校)
     * @Return java.util.List<java.lang.String> 返回企业名称的集合
     * @Author Zhangtd
     * @Date 2020/2/28
     */
    public  List<String> queryOrgNameByEnterprisesType(String enterprisesType){
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //因为使用termQuery(),数据库中字段enterprisesType要加".keyword"
boolQueryBuilder.must(QueryBuilders.termQuery("enterprisesType.keyword",enterprisesType));
        Iterable<SimpleOrg> search = orgRepository.search(boolQueryBuilder);
        List<String> orgNameList = Lists.newArrayList();
        for (SimpleOrg simpleOrg : search) {
            orgNameList.add(simpleOrg.getName());
        }
        return orgNameList;
    }

2、检索下级数据

        for (String param : aggregationParam) {
            TermsAggregationBuilder size = AggregationBuilders.terms(param).field(param).size(300);
            //查询下级数据size.build(AggregationBuilders.terms())
            nativeSearchQueryBuilder.addAggregation(size);
        }

        AggregatedPage<FileManagement> search =
                (AggregatedPage<FileManagement>) fileRepository.search(nativeSearchQueryBuilder.build());

        Map<String, Aggregation> asMap = search.getAggregations().getAsMap();

        for (int i = 0; i < aggregationParam.length; i++) {
            Terms terms = (Terms) asMap.get(aggregationParam[i]);
            List<String> arrayList = new ArrayList<>();
            for (Terms.Bucket bucket : terms.getBuckets()) {
                String s1 = bucket.getKey().toString();
                arrayList.add(s1);
                long docCount = bucket.getDocCount();
            }
            //startYear只要最小年份,endYear只要最大的年份
            if ("startYear".equals(aliasAggregationParam[i])) {
                Collections.sort(arrayList);
                hashMap.put(aliasAggregationParam[i], arrayList.get(0));
            }
            if ("endYear".equals(aliasAggregationParam[i+1])) {
                Collections.sort(arrayList);
                hashMap.put(aliasAggregationParam[i+1], arrayList.get(arrayList.size() - 1));
            } else {
                hashMap.put(aliasAggregationParam[i], arrayList);
            }
        }

3-1、检索多个字段,匹配同一个值

 3-2、.must()

如果使用.must(),那么检索条件中必须满足检索要求,但是检索时候会对“keyword”内容进行拆分(例如“张三”会拆成“张”、“三”两个词检索,满足一个就会返回)
bqbStraAgree.must(QueryBuilders.multiMatchQuery(keyWord,"province","city"));

 3-3、.should()

如果使用.should(),那么检索结果中不满足该条件也会返回,只是满足该条件的会排在前面
bqbStraAgree.should(QueryBuilders.multiMatchQuery(keyWord,"province","city"));

3-3-1、.should()--一个key多个value

//构造类型查询条件
BoolQueryBuilder typeQueryBuilder = new BoolQueryBuilder();
//must连接其他条件,相当于and;should相当于or
boolQueryBuilder.must(typeQueryBuilder.should(QueryBuilders.termQuery("type", 0))
        .should(QueryBuilders.termQuery("type", 1)));
参考:https://blog.csdn.net/hu_zhiting/article/details/110956879

4、java中匹配ES中多个字段查询(为什么加上.keyword反而无结果了呢?)

    public List<String> queryOrgNameByEnterprisesType(String enterprisesType) {
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termQuery("enterprisesType.keyword", enterprisesType));
        //查询有结果
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("name", "农业"));
        //查询无结果
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("name.keyword", "农业"));
        //boolQueryBuilder.must(QueryBuilders.matchPhrasePrefixQuery("name.keyword",orgName));
        Iterable<SimpleOrg> search = orgRepository.search(boolQueryBuilder);
        List<String> orgNameList = Lists.newArrayList();
        //去重
        for (SimpleOrg simpleOrg : search) {
            if (!orgNameList.contains(simpleOrg.getName())) {
                orgNameList.add(simpleOrg.getName());
            }
        }
        return orgNameList;
    }

5-1、检索ES数据库--未超过1W条

BoolQueryBuilder bqbUnincorpUnit = boolQuery();
bqbUnincorpUnit.must(QueryBuilders.rangeQuery("establishmentYear").to(year,true))
               .must(QueryBuilders.termQuery("enterprisesType.keyword", "非法人"))
               .must(QueryBuilders.matchPhraseQuery("province", keyWord));
//如果返回结果超过1W条,这里会报异常
Iterable<SimpleOrg> searchUnincorpUnit = orgRepository.search(bqbUnincorpUnit);
reportVo.setUnincorporatedUnitCount(CommonUtils.iterableCount(searchUnincorpUnit));

5-2、检索ES数据库--超过1W条,可以通过分页查询实现

BoolQueryBuilder bqbPatent = boolQuery();
bqbPatent.must(QueryBuilders.rangeQuery("year").to(year,true))
         .must(QueryBuilders.matchPhraseQuery("province", keyWord));

Pageable pageable = PageRequest.of(0, 10);
SearchQuery queryPatent = new NativeSearchQueryBuilder()
            .withQuery(bqbPatent).withPageable(pageable).build();
Page<Patent> patentPage = patentRepository.search(queryPatent);
System.out.println("个数:"+patentPage.getTotalElements());

6、检索字段排序-NativeSearchQueryBuilder 

public Result getScienceDeputyList(HttpServletRequest request) {
        Result result = new Result();
        result.setCode("200");

        int offset = Integer.valueOf(request.getParameter("offset")) - 1;
        int limit = Integer.valueOf(request.getParameter("limit"));
        String province = request.getParameter("dispatch.fromOrg.Province");
        String year = request.getParameter("dispatch.fromYear");
        String orgName = request.getParameter("dispatch.fromOrg.orgName");
        
        //排序
        Pageable pageable = PageRequest.of(offset, limit, Sort.Direction.DESC, "dispatch.fromYear.keyword");

        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (StringUtils.isNotEmpty(province)) {
            boolQueryBuilder.must(QueryBuilders.termQuery("dispatch.fromOrg.Province.keyword", province));
        }
        if (StringUtils.isNotEmpty(year)) {
            boolQueryBuilder.must(QueryBuilders.termQuery("dispatch.fromYear.keyword", year));
        }
        if (StringUtils.isNotEmpty(orgName)) {
            boolQueryBuilder.must(QueryBuilders.termQuery("dispatch.fromOrg.orgName.keyword", orgName));
        }

        nativeSearchQueryBuilder.withQuery(boolQueryBuilder).withPageable(pageable);
        Page<ScienceDeputy> page = scienceDeputyRepository.search(nativeSearchQueryBuilder.build());

        Map<String, Object> contentMap = new HashMap<>();
        contentMap.put("content", page.getContent());
        result.setData(contentMap);
        result.setPageSize(page.getSize());
        result.setPageNumber(page.getNumber());
        result.setCount(page.getTotalElements());
        return result;
    }
#或者构建sortBuilder 
FieldSortBuilder sortBuilder = SortBuilders.fieldSort("signDate").order(SortOrder.ASC);
nativeSearchQueryBuilder.withQuery(bqbAgreement).withSort(sortBuilder);

7、聚合检索ES-某个字段下所有的值(去重)

方法一:聚合

public Result newsType() {
    Map<String, Object> resultMap = new HashMap<>();
    List<String> typeList = new ArrayList<>();
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

    TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("secondFileType").field("secondFileType.keyword");
    nativeSearchQueryBuilder.addAggregation(aggregationBuilder);
    AggregatedPage<News> aggregatedPage = (AggregatedPage<News>) newsRepository.search(nativeSearchQueryBuilder.build());
    Terms terms = (Terms) aggregatedPage.getAggregations().getAsMap().get("secondFileType");
     for (Terms.Bucket bucket : terms.getBuckets()) {
         typeList.add(bucket.getKey().toString());
     }
     resultMap.put("content",typeList);
     return success(resultMap);
}

方法二:Collapse

返回的是去重后整行数据,不是只某个字段

#对“adminPartOf”这个字段中的内容去重(类型)
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withCollapseField("adminPartOf.keyword");
Page<SimpleOrg> search1 = orgRepository.search(nativeSearchQueryBuilder.build());

#依赖
<!--<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-elasticsearch</artifactId>
  <version>3.2.3.RELEASE</version>
</dependency>-->

8、自定义检索

    public void test1(){
        String field = "instName";
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //检索条件(departureDate字段的值不为空字符串)
        boolQueryBuilder.mustNot(QueryBuilders.termQuery("departureDate.keyword", ""));

        //查询结果条件(查询100条数据,按照departureDate字段升序排序返回)
        PageRequest of = PageRequest.of(0, 100, Sort.Direction.ASC, "departureDate.keyword");

        NativeSearchQuery build = nativeSearchQueryBuilder
                .withQuery(boolQueryBuilder)
                //聚合结果条件(返回13条)
                .addAggregation(AggregationBuilders.terms(field).field(field+".keyword").size(13))
                .withPageable(of)
                .build();

        AggregatedPage<VisitOut> aggregatedPage = elasticsearchTemplate.queryForPage(build, VisitOut.class);

        //获取正常查询数据
        List<VisitOut> content1 = aggregatedPage.getContent();
        System.out.println(JSON.toJSONString(content1, true));

        //获取聚合数据
        Aggregations aggregations = aggregatedPage.getAggregations();
        Map<String, Aggregation> asMap = aggregations.getAsMap();

        List<Map<String, Object>> list = new ArrayList<>();

        for (Terms.Bucket bucket : ((Terms) asMap.get(field)).getBuckets()) {
            Map<String, Object> map = new HashMap<>();
            map.put(bucket.getKeyAsString(), bucket.getDocCount());
            list.add(map);
        }

        System.out.println(JSON.toJSONString(list, true));


    }

9、Cardinality去重

        NativeSearchQueryBuilder pifiNSQB = new NativeSearchQueryBuilder();
        BoolQueryBuilder pifiBQB = QueryBuilders.boolQuery();
        //检索条件
        pifiBQB.must(QueryBuilders.termQuery("perYear.keyword", year))
                .must(QueryBuilders.termQuery("perType.keyword", "访问学者"));

        NativeSearchQuery pifiBuild = pifiNSQB
                .withQuery(pifiBQB)
                //聚合字段
                .addAggregation(
                    //统计人名去重后的数量
                    AggregationBuilders.cardinality("count").field("name.keyword"))
                .build();

        //---------------------------------(AggregatedPage<T>)
        AggregatedPage<InternationalPerson> search = (AggregatedPage<InternationalPerson>) internPersonRepository.search(pifiBuild);
        Cardinality cardinality = search.getAggregations().get("count");
        long value = cardinality.getValue();

10、filter与query比较

filter:不排序、没有相关度评分,速度较快;

query:根据相关度评分排序,速度较慢; 

11、分词器

1、ik中文分词器以及在线停用词

elasticsearch ik中文分词器的使用详解 - Reynold.C - 博客园

2、Elasticsearch中使用ik分词器 JAVA api

Elasticsearch中使用ik分词器 JAVA api_张胜楠的博客-CSDN博客_es ik java

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java-es查询 的相关文章

  • 不可变子类

    我目前正在开发一个多线程框架 为了避免副作用 我想要求框架操作的所有数据都必须是不可变的 那么Java中是否存在一种方法来指定我希望给定类的所有子类或实现给定接口的所有类都是不可变的 我建议调查一下变异性检测器 http code goog
  • 非常大的 JTable、RowFilter 和额外负载

    我想请求澄清 RowFilter 的使用及其对性能的影响 我通过 include Entry 方法实现了一个过滤器 对于每一行 只需检查模型中其对应值是否设置了布尔标志 如果是 则返回 true 否则返回 false 现在 我拥有的 JTa
  • Java:提取具有多个子目录的zip文件[重复]

    这个问题在这里已经有答案了 我有一个 zip Meow zip 它有多个文件和文件夹 如下所示 Meow zip 文件 txt 程序 exe Folder 资源 xml AnotherFolder OtherStuff 更多资源 xml 我
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • Java 中的原始数据类型是线程安全的吗

    原始数据类型是这样的吗int shortJava 线程安全 我执行了以下代码 有时看不到预期结果 500 public class SampleThree extends Thread static long wakeUpTime Syst
  • 谁能解释一下POJO或POCO的含义和用法[重复]

    这个问题在这里已经有答案了 可能的重复 纯旧 Java 对象 POJO 一词的确切含义是什么 https stackoverflow com questions 3326319 what does the term plain old ja
  • Spring - 是否可以获取所有使用@ComponentScan注册的包?

    是否可以获取使用 ComponentScan 注册的所有包的列表 我需要知道 我的 Spring Boot 应用程序中已经注册了哪些 root 包 可能的解决方案 在运行时扫描Java注释 https stackoverflow com q
  • Java:无法从未命名的模块读取包?

    在将项目转移到 Gradle 时 我停止使用 org json 的自定义构建 该构建安装了 module info java 以符合模块系统 现在 我通常通过 Maven 使用它 并且由于 org json 默认情况下不是一个模块 因此它被
  • 为什么我们在Java中使用接口引用类型? [复制]

    这个问题在这里已经有答案了 我即将参加第一门面向对象编程课程的期末考试 但我仍然不明白多态性的概念 假设我有一个抽象类 Vehicle 该类有一个名为 Aircraft 的子类 我的问题是 这两个代码有什么不同 Aircraft Jetpl
  • 将两个表视图绑定在一起,以便它们同步滚动

    我想将两个表视图绑定在一起 以便它们同步滚动 我怎么做 我无法找到如何访问表格视图的滚动条 我做了一个CSS hack来将Tableview与外部滚动条绑定 一个滚动条控制两个表格视图 我的想法的概述 创建两个表视图 制作一个垂直滚动条 在
  • 如何更改鼠标进入/鼠标退出时按钮的图标图像?

    我想更改鼠标输入和鼠标退出时按钮的图标图像 private void jButton1MouseEntered java awt event MouseEvent evt this jButton1 setBackground Color
  • Xstream:删除类属性

    我该如何删除类 某事 Xstream 中的属性 我使用带注释的 Xstream 我读了它的代码 发现你的类不是mapper defaultImplementationOf fieldType 它会为你添加默认的类属性 除非类属性名称为nul
  • 将 uiautomator 测试用例与 Android 中的应用程序代码集成

    我正在使用 Eclipse IDE 这是我的 uiautomator 测试用例代码 public class caltest extends UiAutomatorTestCase public void testDemo throws U
  • 如何在活动之间传递大型集合(主从流)

    背景 我正在实现一个从网络服务读取有关电影信息的应用程序 该网络服务返回有关每部电影的一些信息 标题 日期 海报网址 导演 演员等 该 Web 服务支持分页 因此电影以 100 部为一组加载 执行 这个想法是显示一个包含所有海报的网格 当用
  • 无法在 Vaadin Maven 项目上运行 mvn vaadin:compile

    当我运行命令 mvn vaadin compile 时出现此错误 INFO BUILD FAILURE INFO INFO Total time 1 039s INFO Finished at Thu Mar 20 11 35 00 CET
  • 如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

    有没有人尝试过在 spring boot 中禁用 mongodb 的自动配置 我正在尝试使用 spring data mongodb 来启动 spring boot 使用基于java的配置 使用 spring boot 1 2 1 RELE
  • java:如何仅选择jtable中的一个单元格而不是整行

    在 jTable 中 我希望当用户单击单元格时 这句话会打印在屏幕上 I am cell in row X and column Y 其中 x 和 Y 是单击单元格的行和列 但我得到的是 例如 当我单击第 1 行和第 4 列中的单元格时 我
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • 错误:升级到 lombok 1.16.2 后包 javax.annotation 不存在

    我的 android 项目使用 lombok 1 16 0 构建得很好 但是一旦我将依赖项更改为目标 1 16 2 我在使用 lombok 注释的任何地方都会收到以下错误 Error 20 1 error package javax ann
  • 使用 HttpClient 在 java 中进行连接池 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 HttpClient 创建连接池 我必须频繁连接到同一台服务器 值得创建这样一个池吗 是否可以保持 HTTP 连接处于活动状

随机推荐

  • 堆和栈的区别

    1 1内存分配方面 堆 一般由程序员分配释放 若程序员不释放 程序结束时可能由OS回收 注意它与数据结构中的堆是两回事 分配方式是类似于链表 可能用到的关键字如下 new malloc delete free等等 栈 由编译器 Compil
  • leetcode622-设计循环队列

    本题重点 1 选择合适的数据结构 2 针对选择的数据结构判断 空 和 满 这两点是不分先后次序的 在思考时应该被综合起来 事实上 无论我们选择链表还是数组 最终都能实现题中描述的 循环队列 的功能 只不过选择不同结构时 我们面临和需要解决的
  • 不是一个PDF文件或该文件已损坏

    之前用公司电脑打开PDF文档的时候 出现了这样的一种现象 就是提示格式错误 不是一个PDF文件或该文件已被损坏 有三种解决方法 1 有可能是电脑上自带的PDF阅读软件版本太低 出现了不兼容的现象 换个最新的PDF阅读器吧 我用了福昕阅读器很
  • 【死磕NIO】— 探索 SocketChannel 的核心原理

    大家好 我是大明哥 一个专注于 死磕 Java 系列创作的程序员 死磕 Java 系列为作者 chenssy 倾情打造的 Java 系列文章 深入分析 Java 相关技术核心原理及源码 死磕 Java https www cmsblogs
  • oracle不小心将表update修改了如何回滚

    oracle提供了一种闪回的方法 可以将某个时间的数据给还原回来 SELECT FROM T DIS EVENT RELATION TYPE AS OF TIMESTAMP TO TIMESTAMP 2023 08 08 15 31 00
  • python opencv 在线读取网络图片图像资源

    opencv在线读取网络图片图像资源 照例打开opencv3 3 0 python3 6官方文档 https docs opencv org master d8 dfe classcv 1 1VideoCapture html 详解 官方文
  • Adam和AdamW的区别

    Adam 与 Adamw的区别 一句话版本 Adamw 即 Adam weight decate 效果与 Adam L2正则化相同 但是计算效率更高 因为L2正则化需要在loss中加入正则项 之后再算梯度 最后在反向传播 而Adamw直接将
  • python框架和模型库_一个pytorch库,拥有最先进的架构,预训练模型和实时更新结果...

    PytorchInsight This is a pytorch lib with state of the art architectures pretrained models and real time updated results
  • first season last episode,Rachel finds out Ross likes her,what would she do???

    Scene Central Perk the whole gang is there Ross is showing pictures of his new baby boy Ben to the group Ross And here s
  • Flex布局

    之前一直都是使用position来定位块的位置 现在新学了一个比较主流的flex来定位块的位置 感觉确实比之前的好多了 现在总结下大概的用法 flex是把一个div分成主轴和交叉轴 其中主轴方向的定位有三个 1 flex direction
  • [OpenAirInterface实战-13] :OAI 基站配置文件详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120791987 目录 第1章 基站配
  • Java中为什么数组没有实现Iterable接口,但可以使用foreach语句遍历?

    本质是转成fori形式的循环 上界是数组的size 直接上代码 package com finchina public class TstMain1 public static void main String args int ints
  • 西门子dcs系统组态手册下载_什么是PCS?----西门子PCS7篇

    PCS 7 PCS7是西门子的DCS系统 基于过程自动化 从传感器 执行器到控制器 再到上位机 自下而上形成完整的TIA 全集成自动化 架构 主要包括Step7 CFC SFC Simatic Net和WinCC以及PDM等软件 组态对象选
  • 华为OD题目: 租车骑绿道

    package com darling boot order od od19 import com google common base Strings import java util 租车骑绿道 p 题目 部门组织绿岛骑行团建活动 租用
  • ArrayBlockingQueue

    在java多线程操作中 BlockingQueue
  • [系统安全] 十七.Windows PE病毒概念、分类及感染方式详解

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • Intellij Idea插件开发-创建项目层级的右键菜单

    在使用Android Studio的过程中 发现自带的一些插件无法满足项目的实际需要 便着手自己开发对应的插件 下面是我开发插件过程中的一个记录 会持续和大家分享 分享一 创建Project右键菜单 1 按照项目向导一步一步创建一个Demo
  • 刷脸支付通过人脸识别就可以完成付款

    发展个人码质优价廉所以说 刷脸支付是建立在长达几年的技术积累和市场认可的基础上建立起来的产品 并非是一蹴而就的 刷脸支付的到来 让我们的支付交易手段迈入一个新的阶梯 也可以说是进入了支付的时代 刷脸支付成为新的支付趋势的原因 缓解对外部媒介
  • 最小二乘法

    首先给出公式 最小二乘法的公式 y a x b 其中式中N是数据点的个数 注意 以上两式具有相同的分母 指逐项加法计算 取和 x指对所有的x值求和 y指对所以的y值求和 x 2 指对所有x的平方求和 xy指对所有的积xy进行取和计算 应注意
  • java-es查询

    目录 1 检索ES数据库 2 检索下级数据 3 1 检索多个字段 匹配同一个值 3 2 must 3 3 should 3 3 1 should 一个key多个value 4 java中匹配ES中多个字段查询 为什么加上 keyword反而