SpringBoot整合ElasticSearch(控制度查询,⽗⼦关系建⽴)
花了⼀个多⽉的时间,终于从懵懵懂懂到现在基本弄出了⼀个⽐较完整的结合需求的搜索引擎。中间遇到了很多问题,踩过很多的坑,中间也查阅过很多资料。但是感觉这⽅⾯深⼊⼀点的只是还是蛮少的,现在就将⼀个多⽉⾥做出来的东西做⼀个总结,希望⼤家共勉。
ElasticSearch安装什么的我就不多说了,安装完之后记得顺带装上Elastic-head和Sense(Beta)两个插件。在Chrome⾥⾯有,可以轻松的看到索引数据等信息。这⼏块资料很多,不会的同学⾃⾏百度⼀下。这⾥强调⼀下千万要记得你使⽤的版本,就我个⼈这些天的使⽤来说,版本不⼀样,可能⾥⾯的⽅法会有这很⼤的不同。反正尽量将版本统⼀。
⼀、集配置
集好处不⾔⽽喻,现在基本上这种微服务的框架都会⽀持集的配置。ES集的配置也很简单,只需要将下载的ES⽂件复制⼏份就可以了。我这⾥⽤的是ES5.2.0,也就是2.X的版本。
复制完成之后,打开⽬录下⾯的config,到l⽂件,并编辑。
主机配置:
cluster.name: market #集名称
node.name: master #该节点名称
http.port: 9200 #外部访问端⼝
network.host: 127.0.0.1 #对应ip
node.master: true #是否为主机
从机配置:
cluster.name: market
node.name: server1
http.port: 9201
node.master: false
network.host: 127.0.0.1
多个从机只需要改变其中的 node.name, p.port, http.port三个变量就可以了。等全部配置完成之后,先重启⼀下服务,注意三个服务全部重启。然后打开elasticsearch-head插件查看集状态,如果为绿⾊的,则证明搭建成功。如果为黄⾊的,可能是配置有问题,需要查看⼀下配置。
搭建成功⽰意。
⼆、SpringBoot+ElasticSearch
⾸先新建⼀个SpringBoot项⽬,然后导⼊Maven包。我Pom⽂件⾥东西太多了,我下⾯就只写与ES有关的包,其他的需要请⾃⾏添加。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
</dependency>
</dependencies>
application.properties配置⽂件中加上如下配置,如果有集的话,集间使⽤逗号隔开,注意集名字不要写错。
# elasticsearch搜索引擎
#节点名字,默认elasticsearch
spring.data.elasticsearch.cluster-name=market
#节点地址,多个节点⽤逗号隔开
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302
#是否开启本地存储
spring.abled=true
配置完之后去新建ES实体。这⾥的ES实体和普通的实体区别不⼤,只是需要加上@Document和@Field注解。
package com.ity.es;
import lombok.*;
slf4j.Slf4j;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
@Data
@Document(indexName = "listing",type = "salesListing", shards = 3,replicas = 0, refreshInterval = "-1")
public class SalesListingES implements Serializable {
@Id
private Integer id;
@Field(type = FieldType.Text, searchAnalyzer="ik_max_word", analyzer="ik_max_word")
private String enTitle;
@Field(type = FieldType.Text, searchAnalyzer="ik_max_word", analyzer="ik_max_word")
private String cnTitle;
@Field(type = FieldType.Integer,store=true)
private int categoryId;
@Field(type = FieldType.Text, searchAnalyzer="ik_max_word", analyzer="ik_max_word")
private String description;
}
@Document中indexName对应的是索引名称,type对应的是该⽚段的名称,shard代表分⽚的数量,replicas代表副本数量。这些注解的具体意思可以到下⾯这个地址去看,写的很详细。
这⾥注意es的indexName是不能⽤⼤写的,所有字母必须是⼩写。我当时某次使⽤⼤写,然后搞了半天索引⽆法创建。最后才发现是因为indexName写成了⼤写的原因。type名称没有要求。
@Field注解主要是对字段进⾏⼀些限制,type设置字段类型,因为我⽤的这个版本没有String类型,可以使⽤Text代替。后⾯SearchAnalyzer是设置分词器,如果在安装阶段没有安装分词器插件或者没有这个需求,就⽆需设置。分词器的安装可⾃⾏百度。
建完索引之后,去建相关的ESRepository接⼝,并继承,ElasticsearchRepository接⼝。
@Repository
public interface SalesListingESRepository extends ElasticsearchRepository<SalesListingES, Integer> {
}
然后Service层中注⼊该接⼝,就和JAP的使⽤⽅法⼀样,可以调⽤其中的CRUD⽅法对ES中的数据进⾏操作。这步⽐较简单,间不⽤多说了。
三、批量数据插⼊
想要把MySQL的数据批量插⼊到ES实体中,现在⽐较流⾏是使⽤logstash-input-jdbc插件。我本⼈也使⽤过这个插件,但是这个插件有⼀个巨⼤的问题,就是假如已经⽣成了ES实体,并指定某些字段的格式,如分词,类型等。如果使⽤logstash-input-jdbc批量插⼊,则会覆盖你指定的格式,也就是类似于重新⽣成⼀份index。如果需要指定mapping的同学还是不要使⽤这个⼯具,如果只是开始学,想加⼊测试数据的,可以使⽤这个⼯具。具体安装我就不多了,想要使⽤这个,必须安装node.js和logstash,不会的同学⾃⾏百度,这⾥主要讲⼀下配置。安装好以上两个插件之后,打开logstash⽬录下⾯的bin⽬录。在bin⽬录中新建⼀个后缀为.conf的⽂件,我这⾥就叫f。然后打开这个配置⽂件,写⼊如下代码。
input {
stdin {
}
jdbc {
mysql下载jar包jdbc_connection_string => "jdbc:mysql://localhost/item"#数据库名称
jdbc_user => "root"#⽤户名
jdbc_password => "1234"#密码
jdbc_driver_library => "F:/downsoft/logstash-5.3.2/jdbc/mysql-connector-java-5.1.47.jar"#mysql驱动位置
jdbc_driver_class => "sql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50"
statement => "select * FROM item_cat"#想要插⼊的表名
schedule => "* * * * *"
type => "itemCat" #type名称
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "item"
document_id => "%{cid}"#索引id对应的数据库id
# template_name => "test"
# template => "F:/downsoft/logstash-5.3.2/jdbc/item.json"
}
stdout {
codec => json_lines
}
}
这⾥注意记得导⼊mysql的jar包存放的位置,然后把数据库的信息改成⾃⼰对应的信息就可以了。改完之后,保存⼀下。然后打开dos,进⼊该配置⽂件存放的地址。输⼊logstash -f +配置⽂件名。然后按回车。
如果这⾥有success,就配置⽂件没有问题,如果现实unsuccess,则会把配置⽂件的错误提⽰出来,根据提⽰修改配置就可以了。
等待所有数据跑完,可以去elasticsearch-head⾥⾯查看索引状况。
这边多说⼀句,如果是指定了maping(ES字段)的格式,是⽆法使⽤这个⼯具批量导⼊的。⽬前来说我没到⽐较好⽤的批量导⼊的⼯具。如果各位朋友有什么好⽤的,也可以在下⾯留⾔告诉我。我⽬前导⼊数据的⽅式还是使⽤⽐较笨的,查⼀条提交⼀条,这个⽅法超级慢。但是可以保证不会去覆盖已定义的mapping。
四、查询控制相关度
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论