全文搜索之elasticsearch

与Spring结合的例子

简介

使用

与Spirng结合

Maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- elasticsearch  -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.12.4.RELEASE</version>
</dependency>

Spring-es.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd">

<!--包扫描,扫描接口-->
<elasticsearch:repositories base-package="com.yuda.index.repositories"/>

<!--客户端-->
<elasticsearch:transport-client id="client" cluster-name="yuda" cluster-nodes="127.0.0.1:9300"/>

<!--Spring管理ElasticSearch-->
<bean class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate" id="elasticsearchTemplate">
<constructor-arg name="client" ref="client"/>
</bean>

</beans>

Repository接口

类似于Spring Data JPA

1
2
3
4
5
6
7
import com.yuda.domain.take_delivery.WayBill;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;

public interface WayBillIndexRepository extends ElasticsearchRepository<WayBill, Integer> {
List<WayBill> findBySendAddress(String sendAddress);
}

实体类

存在SpringDataJPA使用的注解,注意细心甄别一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
@Entity
@Table(name = "M_WAY_BILL")
@Document(indexName = "bos", type = "waybill")
public class WayBill implements Serializable{
@Id
@GeneratedValue
@Column(name = "C_ID")
@org.springframework.data.annotation.Id
@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.Integer)
private Integer id;
@Column(name = "C_WAY_BILL_NUM", unique = true)
@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.String)
private String wayBillNum; // 运单编号
@OneToOne
@JoinColumn(name = "C_ORDER_ID")
private Order order; // 订单信息

@Column(name = "C_SEND_NAME")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String sendName; // 寄件人姓名
@Column(name = "C_SEND_MOBILE")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String sendMobile;// 寄件人电话
@Column(name = "C_SEND_COMPANY")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String sendCompany;// 寄件人公司
@OneToOne
@JoinColumn(name = "C_SEND_AREA_ID")
private Area sendArea; // 寄件人省市区信息
@Column(name = "C_SEND_ADDRESS")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String sendAddress;// 寄件人详细地址信息

@Column(name = "C_REC_NAME")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String recName;// 收件人姓名
@Column(name = "C_REC_MOBILE")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String recMobile;// 收件人电话
@Column(name = "C_REC_COMPANY")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String recCompany;// 收件人公司
@OneToOne
@JoinColumn(name = "C_REC_AREA_ID")
private Area recArea; // 收件人省市区信息
@Column(name = "C_REC_ADDRESS")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String recAddress;// 收件人详细地址信息

@Column(name = "C_SEND_PRO_NUM")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String sendProNum; // 快递产品类型编号:速运当日、速运次日、速运隔日
@Column(name = "C_GOODS_TYPE")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String goodsType;// 托寄物类型:文件、衣服 、食品、电子商品
@Column(name = "C_PAY_TYPE_NUM")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String payTypeNum;// 支付类型编号:寄付日结、寄付月结、到付
@Column(name = "C_WEIGHT")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private Double weight;// 托寄物重量
@Column(name = "C_REMARK")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String remark; // 备注
@Column(name = "C_NUM")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private Integer num; // 原件数

@Column(name = "C_ARRIVE_CITY")
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String arriveCity; // 到达地

@Column(name = "C_FEEITEMNUM")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private Integer feeitemnum; // 实际件数
@Column(name = "C_ACTLWEIT")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private Double actlweit; // 实际重量
@Column(name = "C_VOL")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private String vol; // 体积 输入格式为1*1*1*1,表示长*宽*高*数量
@Column(name = "C_FLOADREQR")
@Field(index = FieldIndex.no, store = true, type = FieldType.String)
private String floadreqr; // 配载要求 (比如录入1=无,2=禁航,4=禁航空铁路)

@Column(name = "C_WAY_BILL_TYPE")
private String wayBillType; // 运单类型(类型包括:正常单据、异单、调单)
/*
* 运单状态: 1 待发货、 2 派送中、3 已签收、4 异常
*/
@Column(name = "C_SIGN_STATUS")
@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.String)
private Integer signStatus; // 签收状态

/*
* 1、新增修改单据状态为“否” 2、作废时需将状态置为“是” 3、取消作废时需要将状态置为“否”
*/
@Column(name = "C_DELTAG")
private String delTag; // 作废标志

//.......
}
  1. @Document(indexName = “bos”, type = “waybill”) 索引名
  2. @Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.Integer) 不分词,存储,类型
  3. @Field(index = FieldIndex.analyzed, analyzer = “ik”, searchAnalyzer = “ik”, store = true, type = FieldType.String) 分词,使用IK分析器,使用IK查询分词器,存储,类型

代码中使用

1
2
3
4
5
6
7
8
@Autowired
private WayBillIndexRepository wayBillIndexRepository;

public void test(WayBill wayBill) {
//有20多个方法,同时还可以自定义查询
wayBillIndexRepository.save(wayBill);
}

总结

elasticsearch通过请求的方式来操作索引库.使用GET,PUT,POST,DELETE对索引库中的数据进行查询,添加,修改,删除.参数可以以Json格式写在请求体中,或者通过Restful风格的URL去请求,然后elasticsearch会根据请求不同去修改数据或者返回Json格式的结果.