集成ElasticSearch

107 阅读1分钟

两种方式集成

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>