@      使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询检索干事

你的位置:18禁无遮挡啪啪摇乳动态图 > 国产网站 >

使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询检索干事

使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询检索干事

前边咱们先容了Spring Boot 整合 Elasticsearch 杀青数据查询检索的功能,在本色名目中,咱们的数据一般存储在数据库中,而且跟着业务的发送,数据也会随时变化。

那么怎样保证数据库中的数据与Elasticsearch存储的索引数据保持一致呢? 最原始的决策等于:当数据发生增更正操作时同步更新Elasticsearch。然则这么的经营耦合太高。接下来咱们先容一种卓绝简短的数据同步方式:Logstash 数据同步。

一、Logstash简介 1.什么是Logstash

logstash是一个开源的干事器端数据解决器具。简短来说,等于一根具备及时数据传输智力的管道,崇拜将数据信息从管道的输入端传输到管道的输出端;与此同期这根管道还不错让你把柄我方的需求在中间加上滤网,Logstash提供里好多功能渊博的滤网以孤高你的各式期骗场景。

Logstash常用于日记系统中做日记采集树立,最常用于ELK中算作日记集合器使用。

2.Logstash的架构旨趣

Logstash的基本历程架构:input=》 filter =》 output 。

input(输入):采集各花样式,大小和开端数据,从各个干事器中集合数据。常用的有:jdbc、file、syslog、redis等。

filter(过滤器)崇拜数据解决与调遣。主若是将event通过output发出之前对其杀青的某些解决功能。

output(输出):将咱们过滤出的数据保存到那些数据库和联系存储中,。

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

3.Logstash怎样与Elasticsearch数据同步

本色名目中,咱们不行能通过手动添加的方式将数据插入索引库,是以需要借助第三方器具,将数据库的数据同步到索引库。此时,Logstash出现了,它不错将不同数据库的数据同步到Elasticsearch中。保证数据库与Elasticsearch的数据保持一致。

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

当今救助数据库与ES数据同步的插件有好多,个人觉得Logstash是稠密同步mysql数据到es的插件中,最清爽况兼最容易配置的一个。

二、安设Logstash

Logstash的使用秩序也很简短,底下素质一下,Logstash是怎样使用的。需要评释的是:这里以windows 环境为例,演示Logstash的安设和配置。

1.下载Logstash

最初,下载对应版块的Logstash包,不错通过上头提供下载elasticsearch的地址进行下载,完成后解压。

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

上头是Logstash解压后的目次, 亚洲精品日韩在线观看高清不卡咱们需要温雅是bin目次中的执行文献和config中的配置文献。一般坐褥情况下,会使用Linux干事器,况兼会将Logstash配置成自启动的干事。这里测试的话,径直启动。

2.配置Logstash

接下来,配置Logstash。需要咱们编写配置文献,把柄官网和网上提供的配置文献,将其进行修改。

第一步:在Logstash根目次下创建mysql文献夹,添加mysql.conf配置文献,配置Logstash需要的相应信息,具体配置如下:

input {     stdin {     }     jdbc {       # mysql数据库纠合       jdbc_connection_string => "jdbc:mysql://localhost:3306/book_test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"       # mysqly用户名和密码       jdbc_user => "root"       jdbc_password => "root"       # 驱动配置       jdbc_driver_library => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\mysql-connector-java-8.0.20.jar"       # 驱动类名       jdbc_driver_class => "com.mysql.cj.jdbc.Driver"       #jdbc_paging_enabled => "true"       #jdbc_page_size => "50000"       jdbc_default_timezone => "Asia/Shanghai"       # 执行指定的sql文献       statement_filepath => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\sql\bookquery.sql"       use_column_value => true       # 是否将字段名调遣为小写,默许true(如果疏淡据序列化、反序列化需求,暴戾改为false);       lowercase_column_names => false       # 需要纪录的字段,用于增量同步,国产网站需是数据库字段       tracking_column => updatetime       # Value can be any of: numeric,timestamp,Default value is "numeric"       tracking_column_type => timestamp       # record_last_run前次数据存放位置;       record_last_run => true       #上一个sql_last_value值的存放文献旅途, 必须要在文献中指定字段的出手值       last_run_metadata_path => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\sql\logstash_default_last_time.log"       # 是否断根last_run_metadata_path的纪录,需要增量同步时此字段必须为false;       clean_run => false       # 树立监听 各字段含义 分 时 天 月  年 ,默许一道为*代表含义:每分钟都更新       schedule => "* * * * *"       # 索引类型       type => "id"     } } output {     elasticsearch {         #es干事器         hosts => ["10.2.1.231:9200"]         #ES索引称号         index => "book"         #自增ID         document_id => "%{id}"     }          stdout {         codec => json_lines     } } 

第二步:将mysql-connector-java.jar 拷贝到前边配置的目次下。上头的mysql.conf配置的是:C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\

mysql-connector-java-8.0.20.jar。那么jar包拷贝到此目次下即可:

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

上头是mysql的驱动,如果是sqlserver数据库,下载SqlServer对应的驱动即可。放弃的位置要与mysql.conf 配置文献中的jdbc_driver_library 地址保持一致。

第三步:创建sql目次,创建bookquery.sql文献用于保存需要执行的sql 剧本。示例代码如下:

select * from book where updatetime >= :sql_last_value order by updatetime desc 

这里使用的增量更新,是以使用:sql_last_value 纪录上一次纪录的临了技艺。

3.启动Logstash

干涉logstash的bin目次,执行如下号令:

logstash.bat -f C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\mysql.conf 

启动收效之后,Logstash就会自动定时将数据写入到Elasticsearch。如下图所示:

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

同步完成后,咱们使用Postman查询Elasticsearch,验证索引是否都创建收效。在postman中,发送 Get 恳求:

http://10.2.1.231:9200/book/_search 。复返终结如下图所示:

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

不错看到,数据库中的数据一经通过Logstash同步至Elasticsearch。评释Logstash配置收效。

三、创建查询干事

数据同步完成后,接下来咱们使用Spring Boot 构建Elasticsearch查询干事。最初创建Spring Boot名目并整合Elasticsearch,这个之前都一经先容过,不了了的知己不错看我之前的著述。

接下来演示怎样封装齐全的数据查询干事。

1.数据实体
@Document( indexName = "book" , replicas = 0) public class Book {     @Id     private Long id;     @Field(analyzer = "ik_max_word",type = FieldType.Text)     private String bookName;     @Field(analyzer = "ik_max_word",type = FieldType.Text)     private String author;     private float price;     private int page;     @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")     private Date createTime;     @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")     private Date updateTime;     @Field(analyzer = "ik_max_word",type = FieldType.Text)     private String category;     public Long getId() {         return id;     }     public void setId(Long id) {         this.id = id;     }     public String getBookName() {         return bookName;     }     public void setBookName(String bookName) {         this.bookName = bookName;     }     public String getAuthor() {         return author;     }     public void setAuthor(String author) {         this.author = author;     }     public float getPrice() {         return price;     }     public void setPrice(float price) {         this.price = price;     }     public int getPage() {         return page;     }     public void setPage(int page) {         this.page = page;     }     public String getCategory() {         return category;     }     public void setCategory(String category) {         this.category = category;     }     public Book(){     }     public Date getCreateTime() {         return createTime;     }     public void setCreateTime(Date createTime) {         this.createTime = createTime;     }     public Date getUpdateTime() {         return updateTime;     }     public void setUpdateTime(Date updateTime) {         this.updateTime = updateTime;     } } 
2.恳求封装类
public class BookQuery {     public String category;     public String bookName;     public String author;     public int priceMin;     public int priceMax;     public int pageMin;     public int pageMax;     public String sort;     public String sortType;     public int page;     public int limit; } 
3.创建Controller死心器
@RestController public class ElasticSearchController {     @Autowired     private ElasticsearchRestTemplate elasticsearchRestTemplate;     /**      * 查询信息      * @param      * @return      */     @PostMapping(value = "/book/query")     public JSONResult query(@RequestBody BookQuery bookQuery){         Query query= getQueryBuilder(bookQuery);         SearchHits<Book> searchHits = elasticsearchRestTemplate.search(query, Book.class);         List<SearchHit<Book>> result = searchHits.getSearchHits();         return JSONResult.ok(result);     }     public Query getQueryBuilder(BookQuery query) {                BoolQueryBuilder builder = boolQuery();         // 匹配器 朦拢查询部分,分析器使用ik (ik_max_word)         List<QueryBuilder> must = builder.must();         if (query.getBookName()!=null && !query.getBookName().isEmpty())             must.add(wildcardQuery("bookName", "*" +query.getBookName()+ "*"));         if (query.getCategory()!=null && !query.getCategory().isEmpty())             must.add(wildcardQuery("category", "*" +query.getCategory()+ "*"));         if (query.getAuthor()!=null && !query.getAuthor().isEmpty())             must.add(wildcardQuery("author", "*" +query.getAuthor()+ "*"));         // 筛选器 精准查询部分         List<QueryBuilder> filter = builder.filter();         // 范围查询         if (query.getPriceMin()>0 && query.getPriceMax()>0) {             RangeQueryBuilder price = rangeQuery("price").gte(query.getPriceMin()).lte(query.getPriceMax());             filter.add(price);         }         // 范围查询         if (query.getPageMin()>0 && query.getPageMax()>0) {             RangeQueryBuilder page = rangeQuery("page").gte(query.getPageMin()).lte(query.getPageMax());             filter.add(page);         }         // 分页         PageRequest pageable = PageRequest.of(query.getPage() - 1, query.getLimit());         // 排序         SortBuilder sort = SortBuilders.fieldSort("price").order(SortOrder.DESC);         //树立高亮后果         String preTag = "<font color='#dd4b39'>";//google的色值         String postTag = "</font>";         HighlightBuilder.Field highlightFields = new HighlightBuilder.Field("category").preTags(preTag).postTags(postTag);         Query searchQuery = new NativeSearchQueryBuilder()                 .withQuery(builder)                 .withHighlightFields(highlightFields)                 .withPageable(pageable)                 .withSort(sort)                 .build();         return searchQuery;     } } 
4.测查验证

启动名目,在Postman中,恳求

http://localhost:8080/book/query 接口查询竹素信息数据。检讨接口复返情况。

 

实战 | 使用Spring Boot + Elasticsearch + Logstash 杀青文籍查询干事

 

咱们看到接口收效复返数据。评释数据查询干事创建收效。

临了

以上,咱们就把使用Spring Boot + Elasticsearch + Logstash 杀青齐全的数据查询检索干事先容完毕。