Java代码实现elasticSearch的DSL复合查询

elasticsearch提供DSL(domain specific language)查询,就是以json格式定义查询条件实现复杂条件查询。

DSL查询分为俩大类: 

  叶子查询:一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。

  复合查询:以逻辑方式组合多个叶子查询后者更改叶子查询的行为方式。

我们还可以对查询结果做进一步的处理,博包括:排序、分页、高亮、聚合等等。

叶子查询:  叶子查询进一步细分有

  全文检索查询:利用分词器对用户输入内容分词,然后去词条列表中匹配。

  精确查询:不对用户输入内容分词,直接精确匹配,一般是查找keyword、数值、日期、布尔类型等等。

  地理查询:用于搜索地理位置。

 代码实现: 我已经把我数据库的信息存储一份到elasticSearch中了,各位在进行下面操作时不忘了把自己数据库的数据存储一份到elasticsearch。  在写代码时,我会先告诉大家在elasticsearch中的代码实现,然后根据elasticsearch的代码去实现Java代码。

    全文检索查询: match(单字段查询)    和    multi_match(多字段查询)        

注意:es中查询数据,最多查询到10000条,但控制台只会显示出10条。所以要注意看到查询结果中显示查询到数据10000条时,很可能符合条件的数据不止10000条。

#match查询所有
GET /items/_search
{
  "query": {
    "match": {
      "name": "脱脂牛奶"
    }
  }
}

控制台返回: 

 我来说一下返回数据中最外层的数据是什么意思:  took 表示查询话费的时间;timed_out表示是否超时;_shared 是分片情况;hits是命中情况,就是符合条件的基本信息。

我们主要看hits命中信息: 其中total中的vaule和relation分别是查询到的信息数量 和 查询方式equals。 max_score 表示最大相关性得分,es有个底层算法可以帮我们算出每条信息与我们搜索内容的相关性。然后后面又是一个hits,这个内层的hits就是我们查询到的每条数据的详细信息,_index表示在哪个索引库中进行的操作;_type表示对什么进行的操作,_source就是查到的每条数据了。

下面我们开始写相应的Java代码:

首先我们要初始化对es操作的客户端:

 private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://localhost:9200")));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }

 然后我们就可以用client对es进行各种操作了。

//查询单、多字段
    @Test
    void testMatch() throws IOException {
        SearchRequest request = new SearchRequest("items");//索引库名
        //单字段
        request.source().query(QueryBuilders.matchQuery("name", "脱脂牛奶"));

        //多字段
        //request.source().query(QueryBuilders.multiMatchQuery("脱脂牛奶", "name", "category"));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析数据
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            ItemDoc itemDoc = JSONUtil.toBean(source, ItemDoc.class);
            System.out.println("itemDoc: " + itemDoc);
        }
    }

首先创建一个用于发送请求的request对象,用于查询的用SearchRequest  ;

单字段就是只对一个字段做查询,比如查询name字段中有 脱脂牛奶 的 ,格式是matchQuery("name", "脱脂牛奶")先写字段名,在写查询内容 。多字段就是对多个字段进行查询,格式是 multiMatchQuery("脱脂牛奶", "name", "category") 先写查询内容,在写n个字段名,就是查询name中有"脱脂牛奶"的或者category中有"脱脂牛奶"的。发送请求用client.search(...) 返回响应数据response。

然后就是解析数据:这个要根据我们在es中做查询时返回的数据格式:我们要的是内层的那个hits中的source中的数据。而我们获取的response是最外面的大括号,里面有 took,timed_out,shards,hits。所以要先获取外层hits:SearchHits searchHits = response.getHits();然后在获取内层hits:SearchHit[] hits = searchHits.getHits();最后获取source:String source = hit.getSourceAsString();这样我们就获得了查询的详细信息了。

精确查询:

//精确查询
    @Test
    void testTerm() throws IOException {
        SearchRequest request = new SearchRequest("items");
        request.source().query(QueryBuilders.termQuery("brand", "德亚"));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析数据
        explainData(response);
    }

    //范围查询
    @Test
    void testRange() throws IOException {
        SearchRequest request = new SearchRequest("items");
        request.source().query(QueryBuilders.rangeQuery("price").gte(10000).lte(15000));
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        explainData(response);
    }

接下来说复合查询:可分为俩类

   第一类:基于逻辑运算组合叶子查询,例如bool;

  第二类:基于某种算法修改查询时的文档相关性算分,从而改变文档排名。

bool查询: 是一个或多个查询子句的组合,组合方式有:

must:必须匹配每个子查询,类似“与”;should:选择性匹配子查询,类似“或”;

must_not:必须不匹配,不参与算法,类似“非” ;filter:必须匹配,不参与算法。

这里说的算法指的是计算该数据与搜索内容相关性的算法,像品牌、价格就不需要参与算法。

@Test
    void testBool() throws IOException {
        SearchRequest request = new SearchRequest("items");

        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("name", "脱脂牛奶"))
                .filter(QueryBuilders.termQuery("brand", "德亚"))
                .filter(QueryBuilders.rangeQuery("price").lte(30000)));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        explainData(response);
    }
//我把解析数据的操作写成了一个方法
private void explainData(SearchResponse response) {
        SearchHits searchHits = response.getHits();

        TotalHits totalHits = searchHits.getTotalHits();
        System.out.println("total: " + totalHits);


        SearchHit[] hits = searchHits.getHits();

        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();

            ItemDoc itemDoc = JSONUtil.toBean(source, ItemDoc.class);

            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (highlightFields!=null&&!highlightFields.isEmpty()) {
                HighlightField name = highlightFields.get("name");
                if (name!=null){
                    String hm = name.getFragments()[0].toString();
                 itemDoc.setName(hm);
                }

                System.out.println("itemDoc: " + itemDoc);
            }

        }
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/786553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

峟思雨水情智能监测与预警系统核心运作机制解析

雨水情智能监测与预警系统&#xff0c;作为现代水文观测领域的尖端技术集成体&#xff0c;其运作机制深度融合了信息采集的精准性、数据传输的高效性、数据分析的智能化以及预警响应的及时性&#xff0c;构建了全方位、多层次的水文安全防线。以下是对该系统核心运作机制的深入…

C++的入门基础

目录 C的简单介绍命名空间命名空间的使用C的输入与输出缺省参数函数重载 C的简单介绍 本贾尼斯特劳斯特卢普博士在C的基础上增加了面向对象的特性&#xff0c;这时又增加了继承和、类、封装的概念&#xff0c;为后来的面向对象的编程奠定了基础&#xff0c;这被命名为C 命名空…

进度条提示-在python程序中使用避免我误以为挂掉了

使用库tqdm 你还可以手写一点&#xff0c;反正只要是输出点什么东西都可以&#xff1b; Demo from chatgpt import time from tqdm import tqdm# 示例函数&#xff0c;模拟长时间运行的任务 def long_running_task():total_steps 100for step in tqdm(range(total_steps), …

用python生成词频云图(python实例二十一)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.词频云图 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

unity-记录位置的坐标系

目录 确定世界坐标系原点的方法 1.创建一个物体 2.在检查器中&#xff0c;将该物体的位置设置为0&#xff0c;0&#xff0c;0 3.观察 父子物体的位置关系 调整坐标轴位置 坐标轴的局部与全局旋转 全局 ​局部 unity使用的是左手坐标系 世界坐标系&#xff1a;是整个游…

从数字化营销与运营视角:看流量效果的数据分析

基于数据打通的“全链路”营销是当下的“时髦”&#xff0c;应用它的前提是什么&#xff1f;深度营销和运营的关键数据如何获得&#xff1f;如何利用数据进行更精准的营销投放&#xff1f;如何利用数据优化投放的效果&#xff1f;如何促进消费者的转化&#xff0c;以及激活留存…

Java语言程序设计——篇二(2)

Java语言基础 运算符与表达式运算符1、算术运算符2、关系运算符3、逻辑运算符&#xff08; &&、||、 !、&、| 、^&#xff09;4、位运算符&#xff08; >>、<<、>>>、&、|、^、~&#xff09;5、赋值运算符6、条件运算符7、字符串运算符8、…

我们公司落地大模型的路径、方法和坑

最近一年&#xff0c;LLM&#xff08;大型语言模型&#xff09;已经成熟到可以投入实际应用中了。预计到 2025 年&#xff0c;AI 领域的投资会飙升到 2000 亿美元。现在&#xff0c;不只是机器学习专家&#xff0c;任何人都能轻松地把 AI 技术融入自己的产品里。 我们整理了一…

AI与智能的差异

在讨论AI&#xff08;人工智能&#xff09;与智能的差异时&#xff0c;可以从以下几个角度来理解&#xff1a; 人工智能&#xff08;AI&#xff09;是指计算机系统执行人类通常需要使用智力才能完成的任务的能力。这包括感知、推理、学习、解决问题等。AI可以通过算法和大数据进…

【C++】开源:格式化库fmt配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍格式化库fmt配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

Aop切面编程(1)

1、aop的使用思想&#xff1a;面向切面的编程&#xff0c;不改变原有代码的基础上&#xff0c;进行拓展&#xff0c;减少代码的冗余&#xff0c;降低耦合性&#xff1b; 2、使用注解进行aop编程&#xff0c;使用自定义注解 2.1导入aop的依赖 <dependency><groupId&…

人话学Python-基础篇-数字计算

一&#xff1a;数字类型 对于最常见的数据类型,数字在Python中分为三类&#xff1a; 整型(int) 表示的是整数类型的所有数字&#xff0c;包括正整数&#xff0c;负整数和0。和C语言不同的是&#xff0c;Python中的int型没有范围的限制&#xff0c;理论上可以从无限小的整数取到…

文献阅读:基于测序的空间转录组方法的系统比较

文献介绍 文献题目&#xff1a; Systematic comparison of sequencing-based spatial transcriptomic methods 研究团队&#xff1a; 田鲁亦&#xff08;广州实验室&#xff09;、刘晓东&#xff08;西湖大学&#xff09; 发表时间&#xff1a; 2024-07-04 发表期刊&#xff…

【YOLO格式的数据标签,目标检测】

标签为 YOLO 格式&#xff0c;每幅图像一个 *.txt 文件&#xff08;如果图像中没有对象&#xff0c;则不需要 *.txt 文件&#xff09;。*.txt 文件规格如下: 每个对象一行 每一行都是 class x_center y_center width height 格式。 边框坐标必须是 归一化的 xywh 格式&#x…

上传图片,base64改为文件流,并转给后端

需求&#xff1a; html代码&#xff1a; <el-dialog v-model"dialogPicVisible" title"新增图片" width"500"><el-form :model"picForm"><el-form-item label"图片名称&#xff1a;" :label-width"10…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

【机器学习】作业 Exam1

线性回归预测 唉&#xff0c;研0了&#xff0c;得学机器学习了。当然还是听的吴恩达老师的课&#xff0c;虽然全是英文&#xff0c;但是&#xff0c;怎么评价呢&#xff0c;讲得既专业又通俗易懂&#xff0c;初学者(像我这样的菜鸡)都值得一看&#xff01;&#xff01; 根据人…

更深入了解汽车与航空电子等安全关键型应用的IP核考量因素

作者&#xff1a;Philipp Jacobsohn&#xff0c;SmartDV高级应用工程师 中国已经连续十多年成为全球第一大汽车产销国&#xff0c;智能化也成为了汽车行业发展的一个重要方向&#xff0c;同时越来越多的制造商正在考虑进入无人机和飞行汽车等低空设备&#xff0c;而所有的这些…

以太网电路相关功能说明

RJ45模块用于PHY芯片之间的互连&#xff0c;如图1所示&#xff0c;RJ45有两种组合形式&#xff0c;一种是分立式&#xff0c;网口变压器和RJ45连接座是分开的&#xff0c;另一种是网口变压器和RJ45集成在一起。 图1 RJ45两种主要形式 接下来以分立式RJ45的百兆网电路做个说明&a…

Xilinx FPGA UltraScale SelectIO 接口逻辑资源

目录 1. 简介 2. Bank Overview 2.1 Diagram 2.2 IOB 2.3 Slice 2.4 Byte Group 2.5 I/O bank 示例 2.6 Pin Definition 2.7 数字控制阻抗(DCI) 2.8 SelectIO 管脚供电电压 2.8.1 VCCO 2.8.2 VREF 2.8.3 VCCAUX 2.8.4 VCCAUX_IO 2.8.5 VCCINT_IO 3. 总结 1. 简介…