本教程仅做个人工作笔记,可能不适用于他人的工作/学习
写在前面
实际生产中,除了考虑产品的性能跟用户体验之外,生产成本也是要考虑的,如果系统是小系统,想对某一个表(200w)做全文检索的话,可以考虑使用mysql自带的full_text索引,没必要使用elasticsearch,毕竟开发相关功能、维护还有服务器的费用,都是相当可观的一笔支出
以下是在mysql中的测试,数据是260w左右
-- 无设置索引 260万条数据查询大概4秒/新增索引之后消耗0.01秒
SELECT * FROM full_text WHERE title = '中国药学杂志'
-- 设置索引后模糊查询还是消耗4秒多,说明百分号前置的情况下索引不生效
SELECT * FROM full_text WHERE title LIKE '%中国药学杂志'
-- 如果将百分号后置,则能使用索引查询,消耗0.01秒
SELECT * FROM full_text WHERE title LIKE '中国药学杂志%'
-- 如果前后都放置%符号,也是不走索引查询的
SELECT * FROM full_text WHERE title LIKE '%中国药学杂志%'
-- 当表中有数据时,新增索引消耗了12秒
ALTER TABLE full_text ADD INDEX index_title (title)
适当的设置索引还是可以很大程度解决查询慢的问题的(前提是充分理解业务,将表设计好)
当然如果很有钱或者是想用ELK全套的,另说
Elasticsearch整合Springboot实现基本的全文检索
前期准备
- 项目为springboot+maven
- 正确部署可用elasticsearch服务
添加相关依赖
根据你的elasticsearch版本选择合适的maven依赖,添加到项目中,截至今天2019/12/27,maven上最新的spring-data-elasticsearch的版本是3.2.3.RELEASE
,笔者使用es版本是6.6,maven依赖如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
创建实体类(Mappings)
Elasticsearch一个核心就是mappings
,【Elasticsearch的mappings】
es的java高级客户端可以通过拼接json去创建一个mappings,代码相对繁琐一点,spring-data-elasticsearch提供了一种用注释创建mappings的方案,首先我们创建一个基本的实体类,如
public class Metadata implements Serializable {
private static final long serialVersionUID = 1L;
private Long recordId;
private Integer metadataType;
private Long bookRecNo;
private String title;
}
稍微做一下改动
import org.springframework.data.elasticsearch.annotations.Field;
@Data
@Document(indexName = "your_index_name", type = "metadata")
public class Metadata implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@JsonSerialize(using = ToStringSerializer.class)
private Long recordId;
@Field(type = FieldType.Integer)
private Integer metadataType;
@Field