全文检索
大约 6 分钟
全文检索
Spring Data Elasticsearch - 参考文档,这是官方文档,建议一定参照文档,这个文档真的很详细。
- Elasticsearch Operations :详细讲解ElasticsearchRestTemplate的使用
- 封装的就是High Level REST Client,这是基于HTTP协议的客户端,是ES官方推荐使用的,也是可以使用的,但是要求对ES的DSL语句熟悉,方便自己做复杂的增删改查。
- Elasticsearch Repositories: 详细讲解Spring Data Elasticsearch的使用
- 这是Spring官方最推荐的,就像JPA,Mybatisplus一样,在DAO层继承ElasticsearchRepository接口,就可以使用封装好的一些常见的操作了,用起来简单方便。
倒排索引
注:全文搜索中的分词结果关键字查询后得到的并不是整条的数据,而是数据的id,要想获得具体数据还要再次查询,这种分词结果关键字叫做倒排索引。
docker安装es
还是本分区惯例,旨在快速集成,如需了解概念性知识点,请查阅分区知识点-ES
#下载es
jingxc@JingxcdeMacBook-Pro ~ % docker pull elasticsearch
Using default tag: latest
Error response from daemon: manifest for elasticsearch:latest not found: manifest unknown: manifest unknown
#提示没有发现最新版本
docker pull elasticsearch:7.12.0
#由于我的9200端口被其他程序占用了,所以修改了下对外的端口
#启动es
docker run -di --name elasticsearch -p 9201:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" elasticsearch:7.12.0
{
"name" : "60da4212bc6d",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "nkS19W9pTFyE74C8jcHdCQ",
"version" : {
"number" : "7.12.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
"build_date" : "2021-03-18T06:17:15.410153305Z",
"build_snapshot" : false,
"lucene_version" : "8.8.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
#安装kibana
#由于本机是arm64的苹果系统,所以选的版本有点特殊,其他的直接docker pull kibana就好
jingxc@JingxcdeMacBook-Pro ~ % docker pull kibana:7.12.0
7.12.0: Pulling from library/kibana
no matching manifest for linux/arm64/v8 in the manifest list entries
docker pull elastic/kibana:7.12.0
#运行启动
docker run -di -p 5601:5601 --name kibana --link elasticsearch:elasticsearch bitnami/kibana:7.12.0
访问http://localhost:5601/app/dev_tools#/console即可
安装中文分词
下载安装包https://github.com/medcl/elasticsearch-analysis-ik/tags
复制到容器内部
# 进入下载目录位置
cd Downloads
# 查看容器id
docker ps -a
...
容器id:698134d97685
...
# 复制
jingxc@JingxcdeMacBook-Pro Downloads % docker cp elasticsearch-analysis-ik-7.12.0.zip 698134d97685:/usr/share/elasticsearch
# 进入容器
docker exec -it 698134d97685 /bin/bash
# 执行安装
elasticsearch-plugin install file:/usr/share/elasticsearch/elasticsearch-analysis-ik-7.12.0.zip
注意
我这里安装的时候报错:
Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/plugins/.installing-7917719685506729347/plugin-descriptor.properties
这边使用了在线安装
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
安装成功后重启即可
maven依赖
<!--es-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
yml配置文件
spring:
elasticsearch:
rest:
uris: 127.0.0.1:9201
实体类
package top.game.server.bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* Document:
* indexName = "product":索引名称,类似于mysql中的数据库;
* type = "doc":文档类型,类似于mysql中的表;
* shards = 5:分片数量
* replicas = 1:副本
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "product", shards = 5, replicas = 1)
public class ProductInfo {
@Id
private String id;
/**
* 中文分词设置,前提是您的es已经安装了中文分词ik插件
* 中文分词有两种形式:
* ik_max_word:会将文本做最细粒度的拆分
* ik_smart:会将文本做最粗粒度的拆分
* type 类型
* analyzer 存储解析器
* searchAnalyzer 查询解析器
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String productName;
}
这里简单介绍一下注解,官方文档里都有,可以直接查看
6.1.1. 映射注解概述
MappingElasticsearchConverter 使用元数据来驱动对象到文档的映射.元数据来自可以注解的实体属性.
有以下注解可用:
@Document: 类级别注解,表示此类是映射到数据库的候选对象.以下为最重要的属性.:
indexName: 此实体的索引名称
type: 映射类型. 如果未设置,则使用类的简单小写名称. (从版本4.0开始不推荐使用)
shards: 索引分片的数量
replicas: 索引副本数量
refreshIntervall: 索引刷新间隔.用于创建索引. 默认为 "1s".
indexStoreType: 索引的索引存储类型.用于创建索引. 默认为 "fs".
createIndex: 配置是否在 repository 加载时创建索引. 默认为 true.
versionType: 版本管理配置. 默认为 EXTERNAL.
@Id: 字段级注解,标记字段本身的意图.
@Transient: 默认情况下,存储或检索文档时,所有的字段都映射到文档中,此字段可以标识不映射该字段
@PersistenceConstructor: 标记已有的构造函数 - 可以是一个 protected package - 当从数据库实例化对象时使用.按照构造函数参数名称映射到检索到的文档中的键值.
@Field: 字段级注解,可以定义字段的属性, 大多数属性映射到各自的 Elasticsearch Mapping 定义 (以下列表不完整,请查看注解的 Javadoc 以获取完整的参考) :
name: 将在 Elasticsearch 文档中表示的字段名称,如果未设置,则使用 Java 字段名称.
type: 字段类型,可以是 Text, Keyword, Long, Integer, Short, Byte, Double, Float, Half_Float, Scaled_Float, Date, Date_Nanos, Boolean, Binary, Integer_Range, Float_Range, Long_Range, Double_Range, Date_Range, Ip_Range, Object, Nested, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type. 请参阅 Elasticsearch 映射类型
为 Date 类型声明 format 和 pattern . 日期类型必须指定 format .
store: 标记是否将原始字段值存储在 Elasticsearch 中, 默认为 false.
analyzer, searchAnalyzer, normalizer for specifying custom custom analyzers and normalizer.
@GeoPoint: 将字段标记为 geo_point 数据类型. 如果字段是 GeoPoint 类的实例,则可以省略.
Repository
package top.game.server.repository;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import top.game.server.bean.ProductInfo;
@Repository
public interface ProductRepository extends ElasticsearchRepository<ProductInfo, String> {
}
接口和实现层
service层
package top.game.server.service;
import top.game.server.bean.ProductInfo;
import top.jingxc.server.config.ReturnResult;
import java.util.List;
import java.util.Optional;
public interface ElasticSearchService {
Optional<ProductInfo> findById(String id);
ReturnResult save();
void delete(ProductInfo blog);
Optional<ProductInfo> findOne(String id);
List<ProductInfo> findAll();
}
实现层
package top.game.server.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.game.server.bean.ProductInfo;
import top.game.server.repository.ProductRepository;
import top.game.server.service.ElasticSearchService;
import top.jingxc.server.config.ConstantCommon;
import top.jingxc.server.config.ReturnResult;
import top.jingxc.server.config.ReturnResultSuccess;
import java.util.List;
import java.util.Optional;
@Service
public class ElasticSearchServiceImpl implements ElasticSearchService {
@Autowired
private ProductRepository productRepository;
@Override
public Optional<ProductInfo> findById(String id) {
return productRepository.findById(id);
}
@Override
public ReturnResult save() {
ProductInfo productInfo = ProductInfo.builder().id("1").productName("测试商品001").build();
ProductInfo save = productRepository.save(productInfo);
return ReturnResultSuccess.builder().code(ConstantCommon.RETURN_CODE_200).data(save).msg("success").count(ConstantCommon.RETURN_COUNT_1).build();
}
@Override
public void delete(ProductInfo blog) {
productRepository.delete(blog);
}
@Override
public Optional<ProductInfo> findOne(String id) {
return productRepository.findById(id);
}
@Override
public List<ProductInfo> findAll() {
return (List<ProductInfo>) productRepository.findAll();
}
}
控制层
package top.game.server.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.game.server.service.ElasticSearchService;
import top.jingxc.server.controller.BaseController;
@RestController
@RequestMapping
public class ElasticSearchController extends BaseController {
@Autowired
private ElasticSearchService elasticSearchServiceImpl;
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@GetMapping("/save")
public void Save() {
elasticSearchServiceImpl.save();
}
}
这样我们调用save方法以后就会默认创建索引,并添加索引数据 通过kibana查看:

kibana同步索引
选择下一步,添加完成以后,在Analytics-Discover下就能看到同步的数据

这里只是简单讲解了Spring Boot和ElaseticSearch的整合使用,可以根据实际需要去官网查看,官方文档也特别的详细
- 本文作者: 景兴春
- 本文链接: https://www.jingxc.top/spring/elastic-search.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!