Elasticsearch 类比 mysql 实现 in and like or(Spring-Data-Elasticsearch)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Elasticsearch 类比 mysql 实现 in and like or(Spring-Data-Elasticsearch)

一、前提

1.springboot 版本为2.2.2.RELEASE

2.spring-boot-starter-data-elasticsearch 版本 跟随springboot版本

3.elasticsearch 版本为6.4.2


需要说明的一点 :拿mysql 类比elasticsearch 类比有点不妥,但是鉴于大部分人都是从传统关系型数据如 mysql ,慢慢才接触到elasticsearch 所以拿两者进行对比,比较好理解和快速上手!


本项目的完整源码地址:
https://github.com/Dr-Water/springdata-es-action


二 、数据准备

  1. 首先准备安装好 es 和 准备实验数据 ,可以参考如下链接
    springboot集成spring-data-elasticsearch 完成对es的操作
    ElasticSearch实战 之 es的安装和使用


实验数据如下:

二、实验

在kibana中修改几条es中的数据


PUT /myes/myuser/1001
{
    "id": 1001,
    "firstName": "张",
    "lastName": "三峰",
    "age": 1001,
    "about": "中华人民共和国"
  }
PUT /myes/myuser/1002
{
    "id": 1002,
    "firstName": "张",
    "lastName": "无极",
    "age": 1002,
    "about": "中华人民共和国公民"
  }
PUT /myes/myuser/1003
{
    "id": 1003,
    "firstName": "王",
    "lastName": "科",
    "age": 1003,
    "about": "中华人民共和国"
  }


修改完记得刷新一下es ,有时候es 不会立即生效


2.1 and

select * from user where about='中华人民共和国' and firstName=‘张’


@GetMapping("/and")
    public Page<User> query( Integer pageNum, Integer pageSize) {
        if(pageNum == null || pageNum <= 0){
            pageNum = 1;
        }
        if(pageSize == null || pageSize <= 0){
            pageSize = 5;
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withQuery(QueryBuilders.boolQuery()
                                        .must(QueryBuilders.termQuery("about","中华人民共和国"))
                                        .must(QueryBuilders.termQuery("firstName","张")))
                    .withPageable(PageRequest.of(pageNum - 1, pageSize))
                    .build();
        System.out.println(searchQuery.getQuery());
        Page<User> page = estemplate.queryForPage(searchQuery, User.class);
        return  page;
    }

2.2 or

select * from user where about='中华人民共和国' and firstName=‘王’


@GetMapping("/or")
    public Page<User> query2( Integer pageNum, Integer pageSize) {
        if(pageNum == null || pageNum <= 0){
            pageNum = 1;
        }
        if(pageSize == null || pageSize <= 0){
            pageSize = 5;
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.boolQuery()
                        .should(QueryBuilders.termQuery("about","中华人民共和国"))
                        .should(QueryBuilders.termQuery("firstName","王")))
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                .build();
        System.out.println(searchQuery.getQuery());
        Page<User> page = estemplate.queryForPage(searchQuery, User.class);
        return  page;
    }

2.3 and or 连用

select * from user where  firstName='张' and( firstName='王’ or about='中华人民共和国公民')


@GetMapping("/andOr")
    public Page<User> query3( Integer pageNum, Integer pageSize) {
        if(pageNum == null || pageNum <= 0){
            pageNum = 1;
        }
        if(pageSize == null || pageSize <= 0){
            pageSize = 5;
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.boolQuery()
                                .must(QueryBuilders.termQuery("firstName","张"))
                                .must(QueryBuilders.boolQuery()
                                        .should(QueryBuilders.termQuery("firstName","王"))
                                        .should(QueryBuilders.termQuery("about","中华人民共和国公民")))
                )
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                .build();
        System.out.println(searchQuery.getQuery());
        Page<User> page = estemplate.queryForPage(searchQuery, User.class);
        return  page;
    }

2.4 like

select * from user where about like '%中华%'


@GetMapping("/like")
    public Page<User> query4( Integer pageNum, Integer pageSize) {
        if(pageNum == null || pageNum <= 0){
            pageNum = 1;
        }
        if(pageSize == null || pageSize <= 0){
            pageSize = 5;
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.wildcardQuery("about","*中华*"))
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                .build();
        System.out.println(searchQuery.getQuery());
        Page<User> page = estemplate.queryForPage(searchQuery, User.class);
        return  page;
    }

2.5 in

select * from user where about in ('中华人民共和国','中华人民共和国公民')


@GetMapping("/in")
    public Page<User> query5( Integer pageNum, Integer pageSize) {
        if(pageNum == null || pageNum <= 0){
            pageNum = 1;
        }
        if(pageSize == null || pageSize <= 0){
            pageSize = 5;
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.boolQuery()
                        .should(QueryBuilders.termQuery("about","中华人民共和国"))
                        .should(QueryBuilders.termQuery("about","中华人民共和国公民")))
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                .build();
        System.out.println(searchQuery.getQuery());
        Page<User> page = estemplate.queryForPage(searchQuery, User.class);
        return  page;
    }


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
在 MySQL 中使用 LIKE
【8月更文挑战第12天】
294 1
|
12天前
|
搜索推荐 关系型数据库 MySQL
mysql like查询优化
通过合理的索引设计、使用全文索引、优化查询结构以及考虑分片和分区表,可以显著提高MySQL中 `LIKE`查询的性能。针对不同的应用场景选择合适的优化策略,能够有效地提升数据库查询效率,减少查询时间。希望这些方法和技巧能帮助您优化MySQL数据库中的模糊查询。
55 4
|
1月前
|
关系型数据库 MySQL API
MySQL 历史数据迁移到 Elasticsearch
MySQL 历史数据迁移到 Elasticsearch
71 4
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
81 0
|
2月前
|
搜索推荐 关系型数据库 MySQL
MySQL 模糊查询新纪元:超越 LIKE+% 的高效探索
在数据库的日常操作中,模糊查询是一项不可或缺的功能,它允许我们根据不完全匹配的关键字来检索数据。传统上,MySQL 使用 LIKE 关键字配合 % 通配符来实现这一功能,虽然灵活但性能上往往不尽如人意,尤其是在处理大型数据集时。今天,我们将一起探索几种超越 LIKE+% 的模糊查询技术,以提升查询效率与用户体验。
288 2
|
3月前
|
Java 关系型数据库 数据库连接
|
4月前
|
存储 关系型数据库 MySQL
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
118 0
|
7天前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
18 5
|
1月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
109 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。

推荐镜像

更多