elasticsearch-springboot增删改查

学习思路:

  1. elasticsearch本地安装
  2. 版本说明
  3. 代码解析

一、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更多原理细节,请查看历史文章,或关注下面公众号

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值