两种方式集成
1、spring-boot-starter-data方式
通过spring-boot-starter-data-elasticsearch集成,4.x以后改为http方式连接,去除了type类型,目前本地使用的elasticsearch7.15.1版本
<!-- 自动化配置 Spring Data Elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
spring配置
spring:
elasticsearch:
rest:
uris: http://localhost:9200 #
# username: elastic
# password: changeme
connection-timeout: 3000ms
socket-timeout: 60s
properties:
max-connection-per-route: 10
创建索引类
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(indexName = "product")
public class ESProductDO {
/**
* ID 主键
*/
@Id
private Integer id;
/**
* SPU 名字
*/
@Field(type = FieldType.Text, analyzer = FieldAnalyzer.IK_MAX_WORD)
private String name;
/**
* 卖点
*/
@Field(type = FieldType.Text, analyzer = FieldAnalyzer.IK_MAX_WORD)
private String sellPoint;
/**
* 描述
*/
@Field(type = FieldType.Text, analyzer = FieldAnalyzer.IK_MAX_WORD)
private String description;
/**
* 分类编号
*/
@Field(type = FieldType.Keyword)
private Integer cid;
/**
* 分类名
*/
@Field(type = FieldType.Text, analyzer = FieldAnalyzer.IK_MAX_WORD)
private String categoryName;
/**
* 创建时间
*/
@DateField
@JSONField(format = "yyyy-MM-dd HH:mm:ss.SSS")
private LocalDateTime createdAt;
}
通过ElasticsearchRestTemplate模板来操作es
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Labx01Application.class)
public class ProductRepository02Test {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 插入一条数据
*/
@Test
public void test2() {
//创建索引并且保存数据结构
ESProductDO esProductDO = ESProductDO.builder().id(2).name("孙悟空").categoryName("玩具")
.cid(1).createdAt(LocalDateTime.now()).description("适合给小孩子玩").sellPoint("200").build();
Integer id = elasticsearchRestTemplate.save(esProductDO).getId();
System.out.println("id:" + id);
}
/**
* 单条数据获取
*/
@Test
public void test3() {
//单条数据查询
ESProductDO esProductDO = elasticsearchRestTemplate.get("2", ESProductDO.class);
System.out.println(esProductDO.toString());
}
/**
* 更新一条数据
*/
@Test
public void test4() {
ESProductDO esProductDO = ESProductDO.builder().name("猪八戒").build();
//构建一个文档
Document document = Document.create().fromJson(JSONObject.toJSONString(esProductDO));
UpdateQuery updateQuery = UpdateQuery.builder("2")
.withDocument(document).build();
UpdateResponse product = elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("product"));
System.out.println(product.toString());
}
/**
* 查询,分页
*/
@Test
public void test() {
//构建查询条件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//组合条件查询
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//termQuery表示精确匹配,should表示不必要条件,如果匹配上就增加文档的得分
boolQueryBuilder.should(QueryBuilders.termQuery("cid", "2"));
//must表示必须满足这个条件,matchQuery表示包含
boolQueryBuilder.must(QueryBuilders.matchQuery("name", "芋道"));
queryBuilder.withQuery(boolQueryBuilder);
NativeSearchQuery searchQuery = queryBuilder.build();
//进行查询
SearchHits<ESProductDO> search = elasticsearchRestTemplate.search(searchQuery, ESProductDO.class);
System.out.println(search.toString());
//进行分页查询
queryBuilder.withPageable(PageRequest.of(0, 10));
SearchHits<ESProductDO> searchHits = elasticsearchRestTemplate.search(queryBuilder.build(), ESProductDO.class);
List<ESProductDO> listData = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
System.out.println(listData.toString());
}
}
2、通过spring-boot-starter-data-jest集成
不建议这种方式,查看maven的更新历史,在2020年就已经停止维护了
<!-- 自动化配置 Spring Data Jest -->
<dependency>
<groupId>com.github.vanroy</groupId>
<artifactId>spring-boot-starter-data-jest</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>