首页 > 数据库 >springboot整合elasticsearch实现MySQL模糊查询

springboot整合elasticsearch实现MySQL模糊查询

时间:2022-10-24 18:35:51浏览次数:74  
标签:jdbc springboot searchSourceBuilder MySQL highlightBuilder public elasticsearch 

es关联mysql实现模糊查询的数据流:

 

 

 1、使用logstash同步mysql数据到es

logstash简介及基本操作:https://blog.csdn.net/yurun_house/article/details/109025588

win10安装logstash:https://www.csdn.net/tags/MtjaYg3sMzc0MjEtYmxvZwO0O0OO0O0O.html

logstash同步mysql数据至elastic:https://blog.csdn.net/shang_xs/article/details/123820059

logstash增量同步问题解决:https://blog.csdn.net/weixin_34326179/article/details/88608713

logstash.conf文件配置:

output {
  elasticsearch {
  #ES的ip地址和端口
  hosts => "http://localhost:9200"
  #hosts => ["localhost:9200","localhost:9202","localhost:9203"]
  #ES索引库名称
  index => "file_info"
  document_id => "%{id}"
  document_type => "doc"
  }
  stdout {
 #日志输出
  codec => json_lines
  }
}

input {
  stdin {
  }
  jdbc {
  jdbc_connection_string => "jdbc:mysql://localhost:3306/onepdf?serverTimezone=GMT%2B8"
  # the user we wish to excute our statement as
  jdbc_user => "root"
  jdbc_password => "12345"
  # the path to our downloaded jdbc driver
  jdbc_driver_library => "D:/maven_local_repository/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar"
  # the name of the driver class for mysql
  jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  jdbc_paging_enabled => "true"
  jdbc_page_size => "50000"
  #要执行的sql文件
  statement => "SELECT id,file_name filename FROM `file_info`"
  #定时配置
  schedule => "* * * * *"
  record_last_run => true
  #关闭自动小写
  lowercase_column_names => false
  last_run_metadata_path => "D:/software/logstash-7.17.6/config/logstash_metadata"
  }
}
View Code

使用elasticsearch-head可视化工具查看es,如下图:

 

 

 

2、使用代码进行模糊查询

核心代码:

@Service("BookServiceImpl")
public class BookServiceImpl {

    //@Autowired
    //private BookRepository bookRepository;
    @Autowired
    public RestHighLevelClient client;

    public void findById(String id) {
        //
        //return bookRepository.findById(id);
    }

    /**
     * 使用CrudRepository中的方法save到es
     * @param book
     * @return
     */
    public void save(Book book) {
        //return bookRepository.save(book);
    }


    public List<FileInfo> search(String keyword) throws IOException {
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("file_info");
        searchRequest.types("doc");
        //设置搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //将多种搜索条件组合到一起,复合查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //如果keyword为null则代表我们要进行全文的检索
        //boolQueryBuilder must 必须满足 mustNot 必须不满足
        if (keyword.equals("null")){
            MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
            boolQueryBuilder.must(matchAllQueryBuilder);

        }else{
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "filename").field("filename", 10);
            boolQueryBuilder.must(multiMatchQueryBuilder);
        }
        //将boolQuery设置到SearchSourceBuild中
        searchSourceBuilder.query(boolQueryBuilder);
        //设置分页
        //searchSourceBuilder.from((page-1)*size);
        //searchSourceBuilder.size(size);
        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("courseName");
        highlightBuilder.field("courseDescription");
        highlightBuilder.preTags("<font style='color:red'>");
        highlightBuilder.postTags("</font>");
        //将高亮设置到搜索请求对象中
        searchSourceBuilder.highlighter(highlightBuilder);
        //将搜索条件设置到reque中
        //searchRequest.source(searchSourceBuilder);
        SearchResponse searchResp = client.search(searchRequest, RequestOptions.DEFAULT);
        //继续解析出数据内容
        // 搜索出的结果
        SearchHits hits = searchResp.getHits();
        List list = new ArrayList();
        for (SearchHit hi:hits) {
            //解析出数据转为map
            Map<String, Object> sourceAsMap = hi.getSourceAsMap();
            //转为对象
            String s = JSON.toJSONString(sourceAsMap);
            FileInfo userTest = JSONObject.parseObject(s, FileInfo.class);
            //放置在List中
            list.add(userTest);
        }
        return list;

    }
View Code

gitee地址:https://gitee.com/caesarthegreat/elastic-search-demo.git

标签:jdbc,springboot,searchSourceBuilder,MySQL,highlightBuilder,public,elasticsearch,
From: https://www.cnblogs.com/caesar-the-great/p/16822367.html

相关文章

  • 从头开始学ElasticSearch
    第一章ElasticSearch概述1.1ElasticSearch概述之基本概念1.2ElasticSearch概述之安装1.3ElasticSearch概述之Kibana安装1.4ElasticSearch概述之增删改查第二章Elastic......
  • mysql事务和隔离级别学习--笔记
    一、MySQL事务1、什么事事务事务(transaction)就是一个最小的单独任务单元由一个或多个SQL语句组成,在这个任务单元中,每个SQL语句都是相互依赖,整个任务单元是作为一个不可分......
  • KYLIN(麒麟系统)下安装MySQL5.0
    1groupaddmysql2useradd-gmysqlmysql3#修改密码4passwdmysql5cd/usr/local6#解压文件7tar-zxvfmysql-standard-5.0.15-linux-i686.tar.gz8......
  • mysql InnoDB建表时设定初始大小的方法
    InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保护数据文件,这就会导致波动。丁奇的博客说明了这个问题:WhenInno......
  • 7.3 ElasticSearch运行机制之排序
    1.简介elasticsearch默认采用相关性算分排序,用户可以通过设定sort参数自行设定排序规则。2.query查询job字段为“Javaengineer”的文档,然后按照出生日期为第一排序字段、......
  • 2.4 ElasticSearch分词之中文分词
    1.简介中文分词是指将一个汉字序列切分为一个个单词的操作。在英文中,单词之间以空格作为自然分界符,汉语中的词是没有形式上的分界符的,这是中文分词的一个难点。比如“乒乓......
  • SpringBoot代理图片、文件等路径
    在config文件夹下新增一个配置类即可 /***@authorcyl*@time2022/10/24*/@ConfigurationpublicclassMyWebAppConfigurationextendsWebMvcConfigurerAda......
  • springcloud学习记录day06--在Java中使用elasticsearch
    RestClient查询文档发起查询请求以matchall为例代码解读:第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页......
  • MySQL 中 不等于 会过滤掉 Null 的问题
    1.原因: 在写SQL条件语句时经常用到不等于!=的筛选条件。  此时要注意此条件会将字段为Null的数据也当做满足不等于的条件而将数据筛选掉。 2.实例:表A ......
  • springboot~redis-cluster动态感应的配置
    redis-cluster是一个高可用,可分片的分布式redis集群解决方案,建议使用springboot2.3及以上版本的脚手架,如果是<2.3版本,你需要手动添加LettuceConnectionFactory来实现因为服......