es搭建教程:二选一
- docker极简安装:nginx、redis、mysql、jenkins、solr、zookeeper、kafka、elasticsearch
- Windows / Linux / Docker 安装ElasticSearch7.x单机/集群 + IK分词器
其他资料
- es文档地址:https://www.elastic.co/guide/index.html
- es下载地址:https://www.elastic.co/cn/downloads/elasticsearch
- es版本对应:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions
本文示例版本
- spring-boot-starter-parent:2.7.8
- spring-data-elasticsearch:4.4.7
- elasticsearch:7.17.3
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
</parent>
<properties>
<elasticsearch.version>7.17.3</elasticsearch.version>
</properties>
<!--es-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
application.yml
# es连接地址
spring.elasticsearch.uris: 127.0.0.1:9200
代码示例
TestEsDto
import lombok.Data;
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;
/**
* @author 954L
* @create 2023/2/8 15:03
*/
@Data
@Document(indexName = "test_es_dto")
public class TestEsDto {
@Id
private Long id;
/* 名称;ik_max_word:细粒度分词 */
@Field(analyzer = "ik_max_word", type = FieldType.Text)
private String name;
/* 备注;ik_smart:粗粒度分词 */
@Field(analyzer = "ik_smart", type = FieldType.Text)
private String remark;
/* 内容;ik_max_word:细粒度分词 */
@Field(analyzer = "ik_max_word", type = FieldType.Text)
private String content;
/* 编码 */
@Field(type = FieldType.Keyword)
private String code;
/* 排序值 */
@Field(type = FieldType.Integer)
private Integer sortNum;
}
TestEsDtoEsRepository
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author 954L
* @create 2023/2/8 15:17
*/
@Repository
public interface TestEsDtoEsRepository extends ElasticsearchRepository<TestEsDto, Long> {
/**
* 不需要写具体的实现,函数名遵循命名规范即可自动实现
* 命名规则参考:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.query-methods
* @param name
* @return
*/
List<TestEsDto> findByName(String name);
}
测试类
import com.alibaba.fastjson.JSON;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import java.util.ArrayList;
import java.util.List;
/**
* @author 954L
* @create 2023/2/8 15:13
*/
@SpringBootTest
class TestEsDtoTest {
@Autowired
private TestEsDtoEsRepository testEsDtoEsRepository;
/**
* 测试新增
*/
@Test
void testInsert() {
// 插入100条数据
List<TestEsDto> testEsDtoList = new ArrayList<>(100);
for (int i = 1; i <= 100; i++) {
TestEsDto testEsDto = new TestEsDto();
testEsDto.setId(Long.valueOf(i));
testEsDto.setName("name-" + i);
testEsDto.setRemark("我是备注abcdefg");
testEsDto.setContent("我是内容hijklmnn");
testEsDto.setCode("CODE");
testEsDto.setSortNum(i);
// 单条插入
// testEsDtoEsRepository.save(testEsDto);
testEsDtoList.add(testEsDto);
}
// 批量插入
testEsDtoEsRepository.saveAll(testEsDtoList);
}
/**
* 查test_es_dto索引的所有数据
*/
@Test
void testFindAll() {
Iterable<TestEsDto> testEsDtoIterable = testEsDtoEsRepository.findAll();
testEsDtoIterable.forEach(x -> System.out.println(JSON.toJSONString(x)));
}
/**
* 修改指定数据
*/
@Test
void testUpdate() {
TestEsDto testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
System.out.println("修改前名称:" + testEsDto.getName());
testEsDto.setName(testEsDto.getName() + "111222333");
testEsDtoEsRepository.save(testEsDto);
testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
System.out.println("修改后名称:" + testEsDto.getName());
}
/**
* 删除指定数据
*/
@Test
void testDelete() {
testEsDtoEsRepository.deleteById(1L);
TestEsDto testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
System.out.println(testEsDto == null? "删除成功": "删除失败");
}
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 复杂查询
*/
@Test
void testSearch() {
// 根据名称查询:方式一
List<TestEsDto> testEsDtoList = testEsDtoEsRepository.findByName("name-100");
testEsDtoList.forEach(x -> System.out.println(JSON.toJSONString(x)));
// 根据名称查询:方式二
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", "name-100");
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchQueryBuilder)
.withFields("id", "name", "remark").build();
SearchHits<TestEsDto> hits = elasticsearchRestTemplate.search(query, TestEsDto.class);
List<SearchHit<TestEsDto>> searchHits = hits.getSearchHits();
System.out.println("共" + searchHits.size() + "条");
TestEsDto testEsDto = searchHits.get(0).getContent();
System.out.println(JSON.toJSONString(testEsDto));
}
}