Spring Boot(十二)集成ElasticSearch

ElasticSearch 和kinana

版本

Springboot: 2.3.1
ElasticSearch: 7.7.1

核心依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

配置

##端口號
server.port=8888
##es地址
spring.elasticsearch.rest.uris=127.0.0.1:9200

核心操作

  • 實體類
    Product
@Document(indexName = "product")
@Data
@ToString
public class Product {

    private long id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;

    private BigDecimal price;

    private String img;

    private String describe;
}

id必須有,否則後面用spring-data-elasticsearch操作會報錯

核心接口: ElasticsearchRepository

大致結構圖
在這裏插入圖片描述
我們操作 ElasticSearch 只需要繼承 ElasticsearchRepository接口就可以了
其中Repository核心方法由這些:
在這裏插入圖片描述

其他類相關方法可以自己去官網查看,這裏不再重述
springboot

我們定義一個ProductMapper

public interface ProductMapper extends ElasticsearchRepository<Product, Long> {
    /**
     * 通過名字查詢
     * @param name
     * @return
     */
    List<Product> findByName(String name);

    /**
     * 通過名字分頁查詢
     * @param name
     * @param pageable
     * @return
     */
    Page<Product> findByName(String name, Pageable pageable);

    /**
     * 通過名字排序查詢
     * @param name
     * @param sort
     * @return
     */
    List<Product> findByName(String name, Sort sort);


}

內置在Spring的查詢構造器會對findBy 這些關鍵詞進行解析然後生成相應的方法,有點類似jpa的操作方式,我們來測試一下
在這裏插入圖片描述

測試

這些都是ElasticsearchRepository接口自帶的方法

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    ProductMapper productMapper;

    @Autowired
    ElasticsearchRestTemplate template;




    @Test
    void insert() {
        Product product = new Product();
        product.setId(3);
        product.setImg("圖片三");
        product.setName("huawei");
        product.setDescribe("好好看的手機呢");
        product.setPrice(new BigDecimal("3999.3"));
        productMapper.save(product);
    }

    /**
     * 批量插入
     */
    @Test
    void inserts() {
        Product product = new Product();
        product.setImg("圖片一");
        product.setName("iphone");
        product.setDescribe("打電話娛樂用的");
        product.setPrice(new BigDecimal("5666.3"));
        List<Product> list = new ArrayList();
        list.add(product);
        productMapper.saveAll(list);

    }

    /**
     * 更新
     */
    @Test
    void update() {
        Optional<Product> product = productMapper.findById(0l);
        Product product1 = product.orElseThrow( RuntimeException::new);
        productMapper.save(product1);

    }

    /**
     * 刪除
     */
    @Test
    void delete() {
        productMapper.deleteById(0l);

    }

}

下面我們來看看通過方法名解析的方法操作

@SpringBootTest
class ProductMapperTest {

    @Autowired
    ProductMapper productMapper;

    @Autowired
    ElasticsearchOperations elasticsearchOperations;



    @Test
    void findByName() {
        List<Product> list = productMapper.findByName("iphone");
        list.forEach(s -> System.out.println(s));
    }

    @Test
    void findByDescribe() {
        List<Product> list = productMapper.findByDescribe("打電話");
        list.forEach(s -> System.out.println(s));
    }

    /**
     * 分頁
     */
    @Test
    void findByNmaePage() {
       Page<Product> list = productMapper.findByName("iphone", PageRequest.of(0, 20));
       list.get().forEach(s -> System.out.println(s));

    }

    /**
     * 排序 通過價格排序
     */
    @Test
    void findBYNameDesc() {
        Sort.TypedSort<Product> product = Sort.sort(Product.class);
        /**
         * 也可以使用這種寫法
         * Sort sort = Sort.by("price").ascending()
         *   .and(Sort.by("name").descending());
         */
        List<Product> list = productMapper.findByName("iphone", product.by(Product::getPrice).descending());
        list.forEach(s -> System.out.println(s));

    }
	/**
     * 複雜一點的查詢
     */
    @Aut
    @Test
    void testQuery() {
        String name = "iphone";
        String price = "6666";
        String describe = "電話";
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        BoolQueryBuilder nameMatch = QueryBuilders.boolQuery().minimumShouldMatch(1)
                .should(QueryBuilders.matchQuery("name",name))
                .should(QueryBuilders.matchQuery("product",price));

        BoolQueryBuilder must = QueryBuilders.boolQuery().minimumShouldMatch(2)
                .should(nameMatch)
                .should(QueryBuilders.matchQuery("price",price))
                .should(QueryBuilders.matchQuery("describe",describe).boost(5));

        builder.must(must);
        NativeSearchQuery query = new NativeSearchQuery(builder);
        PageRequest request = PageRequest.of(0,1);
        query.setPageable(request);

        List<Product> list = elasticsearchOperations.queryForList(query,Product.class, IndexCoordinates.of("product"));
        list.forEach(s -> System.out.println(s));

    }


}

更多操作慢慢研究吧,官網好像API也不算太多,相關資料也不多

源碼下載

下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章