ES软件安装前面说过
MySQL 数据库 表 行 列
ES Index Type Document Filed
Type ES6一个Index中只支持一个Type,ES7中不建议自定义Type
Index操作
创建索引
#创建索引
PUT test4
删除索引
#删除索引
DELETE test4
查看所有索引
#查看所有索引
GET _cat/indices
显示标题
#显示标题
GET _cat/indices?v
查看单个索引信息
#查看单个索引信息
GET test4
创建索引指定参数
#创建索引指定参数
PUT test5
{
"settings" : {
"index" : {
"number_of_shards" : "5",
"number_of_replicas" : "0"
}
}
}
Document
添加数据
#添加数据 _doc就是默认的Type名字
#没有指定id,ES自动分配
POST test4/_doc
{
"sid":"1",
"sname":"zs"
}
#指定ID
POST test4/_doc/4
{
"sid":"2",
"sname":"zl"
}
#PUT也可以添加数据,底层有幂等性检查:执行操作必须有检查
PUT test4/_doc/4
{
"sid":"4",
"sname":"zl"
}
#添加数据
PUT test4/_create/5
{
"sid":"5",
"sname":"aaa",
"age":"11"
}
#PUT/POST执行相同的ID就是update
#添加数据指定Index和自定义Type不建议使用
PUT test2/table1/2
{
"sid":"1",
"sname":"abcd"
}
查看数据
#查看数据
GET /test4/_search
多条件查询
#must:多条件查询
GET test4/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"sname":"zs"
}
},
{
"match":
{
"sid":"1"
}
}
]
}
}
}
}
或查询
#should 多条件 or
GET test4/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"sname":"zs"
}
},
{
"match":{
"sid":"2"
}
}
]
}
}
}
范围匹配
#范围匹配:gt大于, lt小于 gte、ge大于等于 lte、le 小于等于
GET test4/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"sname":"zs"
}
}
],
"filter":{
"range":{
"sid":{
"gte":2
}
}
}
}
}
}
高亮显示
#高亮显示
GET test4/_search
{
"query":{
"match":{
"sname":"zs"
}
},
"highlight":{
"pre_tags":"<font color='red'>",
"post_tags": "</font>",
"fields": {
"sname": {}
}
}
}
查看分词效果
#查看分词效果
GET _analyze
{
"analyzer": "standard",
"text": "z s"
}
#查看分词效果:未安装分词插件,是不支持中文分词的
GET _analyze
{
"analyzer": "standard",
"text": "深海泰坦"
}
#查看分词效果:安装分词插件之后
GET _analyze
{
"analyzer": "ik_max_word",
"text": "深海泰坦"
}
从数据库导入数据到ES
单表导入
配置文件
input {
stdin {
}
jdbc {
jdbc_connection_string => "jdbc:mysql://192.168.195.157:3306/customers"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "7777"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#要执行的sql文件
statement_filepath => "/opt/elasticsearch/logstash-7.4.2/config/customer.sql"
#statement => "select from "
#定时字段各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
type => "customer"
}
}
output {
if[type] == "customer"{
elasticsearch {
#ESIP地址与端口
#hosts => "localhost:9200"
hosts => ["localhost:9200"]
#ES索引名称
index => "customer"
#文档_id, %{cid}意思是取查询出来的cid的值,并将其映射到es的_id字段中
document_id => "%{cid}"
}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
customer.sql
select * from customer
测试启动
./bin/logstash -f ./config/customer.conf -t
创建索引和映射规则
#创建索引(空)
curl -XPUT http://localhost:9200/customer
#设置映射规则
curl -XPOST http://localhost:9200/customer/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"description": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
启动logstash
./bin/logstash -f ./config/customer.conf
只要看到写入sql就一个没问题了,导入成功如下图
我们查询中华也能查到
修改数据库字段
多表导入
创建另一张表的索引以及映射关系
curl -XPUT http://localhost:9200/province
curl -XPOST http://localhost:9200/province/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"pname": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
customer.conf
配置文件
input {
stdin {
}
jdbc {
jdbc_connection_string => "jdbc:mysql://192.168.195.157:3306/customers"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "7777"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#要执行的sql文件
statement_filepath => "/opt/elasticsearch/logstash-7.4.2/config/customer.sql"
#statement => "select from "
#定时字段各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
type => "customer"
}
jdbc {
jdbc_connection_string => "jdbc:mysql://192.168.195.157:3306/customers"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "7777"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#要执行的sql文件
#statement_filepath => "/opt/elasticsearch/logstash-7.4.2/config/customer.sql"
statement => "select * from province"
#定时字段各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
type => "province"
}
}
output {
if[type] == "customer"{
elasticsearch {
#ESIP地址与端口
#hosts => "localhost:9200"
hosts => ["localhost:9200"]
#ES索引名称
index => "customer"
#文档_id, %{cid}意思是取查询出来的cid的值,并将其映射到es的_id字段中
document_id => "%{cid}"
}
}
if[type]=="province"{
elasticsearch {
#ESIP地址与端口
#hosts => "localhost:9200"
hosts => ["localhost:9200"]
#ES索引名称
index => "province"
#文档_id, %{cid}意思是取查询出来的cid的值,并将其映射到es的_id字段中
document_id => "%{pid}"
}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
启动logstash
./bin/logstash -f ./config/customer.conf
看到这两条sql语句就没什么问题
我们在customer.conf
中写了type
的所以这里的字段就有个type
,如果我们 mysql
中也有type
字段就会导不进来,遇到这种情况我们可以给数据库字段取别名,示例:select pid,pname,type as ptype from provice
SpringBoot简单整合Elasticsearch
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
@Document(indexName = "acoffee")
public class Goods {
@Id
private int id;
@Field(index = true,analyzer = "ik_smart",type = FieldType.Text)
private String name;
@Field(index = false,store = true,type = FieldType.Double)
private BigDecimal price;
}
自定义接口
//也可以继承ElasticsearchRepository接口 他们之间的关系图在最上面
public interface GoodsRepository extends CrudRepository<Goods,Integer> {
}
配置文件
spring:
elasticsearch:
rest:
uris: http://192.168.195.157:9200
增加、修改
测试类
@Autowired
GoodsRepository goodsRepository;
@Test
void test01(){
Goods goods = new Goods(1,"运动蓝牙耳机",new BigDecimal(488.00));
goodsRepository.save(goods);
}
执行结果:
查询
在接口中使用我们自己的方法(我们一边写它会一边提示方法名)
public interface GoodsRepository extends CrudRepository<Goods,Integer> {
List<Goods> findGoodsByNameLike(String name);
}
测试类
@Test
void test02(){
List<Goods> good = goodsRepository.findGoodsByNameLike("耳机");
System.out.println(good);
}
执行结果:
删除
void test03(){
Goods goods = new Goods(1,"运动蓝牙耳机",new BigDecimal(488.00));
goodsRepository.delete(goods);
}