学习思路:
- elasticsearch本地安装
- 版本说明
- 代码解析
一、elasticsearch本地安装
1、elasticsearch6.8.4 下载 :https://www.elastic.co/cn/downloads/elasticsearch
如果想要下载指定版本,点击链接进去即可
2、配置
解压后,打开 config/elasticsearch.yml
,对其中两项配置进行修改
cluster.name
集群名称,随便填写,或者使用默认的“my-application”,注意,后面Java链接elasticsearch时,需要该配置。network.host
如果此不配置此项,其他机器无法链接当前elasticsearch。配置为:(0.0.0.0代表任何IP都可访问)- 启动
Mac/Linux:运行bin/elasticsearch
Windows:运行bin\elasticsearch.bat
3、analysis-ik 6.8.4 分词器安装
安装执行命令: bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.4/elasticsearch-analysis-ik-6.8.4.zip
如果下载太慢先运行:npm config set registry https://registry.npm.taobao.org
4、默认端口:9200是http访问端口;9300是tcp访问端口
二、版本说明
1. jdk1.8 2. elasticsearch 6.8.4 3. spring-boot:2.2.1;spring-cloud:Hoxton.RC2
三、代码分析
首先依赖jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
代码结构非常简单
解释:
1、OrderDocument:类似于我们使用关系数据库时的实体对象,这里就是es里的文档概念
@Data
@Document(indexName = "order",type ="order_info" )
public class OrderDocument implements Serializable {
@Id
private Long id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String desc;
@Field(type = FieldType.Long)
private Date createTime=new Date();
@Field(type = FieldType.Long)
private Date updateTime=new Date();
}
indexName:索引名,类似于mysql的表概念;type:类型,类似于mysql表的概念;@id:类似于主键;
关于字段类型及其属性请参考《Elasticsearch数据类型及其属性》
这里我们用的是我们上面安装的ik分词器
2、OrderDocumentRepository:类似于dao
@Component
public interface OrderDocumentRepository extends ElasticsearchRepository<OrderDocument,Long> {
}
Long:是我们上面定义对象的id类型
3、OrderEsService类似于我们平时写的服务类
@Service
@Log4j2
public class OrderEsService {
@Autowired
OrderDocumentRepository orderDocumentRepository;
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
/**
* 保持列表
* @param orderDocuments
*/
public void save(List<OrderDocument> orderDocuments){
elasticsearchTemplate.putMapping(OrderDocument.class);
if (orderDocuments!=null && orderDocuments.size()>0){
orderDocumentRepository.saveAll(orderDocuments).forEach(e->log.info("save======{}",JSON.toJSONString(e)));
}
}
/**
* 保持单个-包含新增修改
* @param orderDocument
*/
public void save(OrderDocument orderDocument){
if (orderDocument!=null && orderDocument.getId()!=null){
log.info("save==={}",JSON.toJSONString(orderDocumentRepository.save(orderDocument)));
}
}
/**
* 按id查询
* @param id
*/
public void getById(Long id){
if (id!=null){
orderDocumentRepository.findById(id).ifPresent(e->log.info("getById===={}",JSON.toJSONString(e)));
}
}
/**
* 按id删除
* @param id
*/
public void deleteById(Long id){
if (id!=null){
orderDocumentRepository.deleteById(id);
}
}
/**
* elasticsearchTemplate实现分页查询
* @param keyword 查询的关键字
* @param pageIndex 开始页
* @param pageNo 每页条数
* @param fieldName 搜索的字段名称数组
*/
public void getByPage(String keyword,int pageIndex,int pageNo,String ... fieldName){
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, fieldName) // matchQuery(),单字段搜索
.analyzer("ik_max_word").operator(Operator.OR);
SearchQuery searchQuery=new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withPageable(PageRequest.of(pageIndex,pageNo))
.build();
AggregatedPage<OrderDocument> orderDocuments = elasticsearchTemplate
.queryForPage(searchQuery, OrderDocument.class);
List<OrderDocument> collect = orderDocuments.get().collect(Collectors.toList());
collect.forEach(e->log.info("getByPage====={}",JSON.toJSONString(e)));
}
/**
* orderDocumentRepository实现分页查询
* @param keyword
* @param pageIndex
* @param pageNo
* @param fieldName
*/
public void get(String keyword,int pageIndex,int pageNo,String ... fieldName){
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, fieldName) // matchQuery(),单字段搜索
.analyzer("ik_max_word").operator(Operator.OR);
Page<OrderDocument> search = orderDocumentRepository.search(queryBuilder, PageRequest.of(pageIndex, pageNo));
List<OrderDocument> collect = search.get().collect(Collectors.toList());
collect.forEach(e->log.info("get====={}",JSON.toJSONString(e)));
}
/**
* 删除索引下的所有数据
*/
public void deleteAll(){
orderDocumentRepository.deleteAll();
}
}
4、application.yml配置
# elasticsearch.yml 文件中的 cluster.name
spring:
data:
elasticsearch:
clusterName: my-application
# elasticsearch 调用地址,多个使用“,”隔开
clusterNodes: localhost:9300
5、OrderEsServiceTest:测试类
文中代码地址:https://gitee.com/carpentor/spring-cloud-example/tree/master/elasticsearch
如果想要了解elasticsearch更多原理细节,请查看历史文章,或关注下面公众号
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢