美文网首页
2-2 ES的API编码

2-2 ES的API编码

作者: Finlay_Li | 来源:发表于2020-08-01 14:16 被阅读0次

model

package com.finlay.scaffold.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
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;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @author: Finlay
 * @description:
 * @date: 2020-07-31 5:20 下午
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "finlay",type = "book")
public class Book {

    @Id
    private String id;
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String name;
    @Field(type = FieldType.Double)
    private BigDecimal price;
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String content;
    private String author;
    private Date  pubDate;
}

repository

package com.finlay.scaffold.repository;

import com.finlay.scaffold.model.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * @author: Finlay
 * @description: CRUD, 泛型说明: 1、操作的实体对象类型  2、实体对象中ID字段的类型
 * @date: 2020-07-31 5:34 下午
 */
public interface BookRepository extends ElasticsearchRepository<Book,String> {

}

Test

启动后,创建出空的索引


image.png

添加文档

public class Test1 extends ApplicationTest {

    @Autowired
    private BookRepository bookRepository;

    /***
      * @description: id存在则更新,不存在则新增:因此先查询再更新,字段值不能为空,否则es 更新为null
      * @return: void
    **/
    @Test
    public void saveOrUpdate() {
        Book book = new Book();
        book.setAuthor("finlay")
                .setContent("这是好东西啊~")
                .setId("1")
                .setName("ElasticSearch")
                .setPrice(BigDecimal.TEN)
                .setPubDate(new Date());
        Book save = bookRepository.save(book);
    }
}
image.png

删除文档

   @Test
    public void delete() {
     bookRepository.deleteById("AXOyjx7bCVm4kyqzZpwh");
    }

查询全部

    @Test
    public void selectAll() {
        Iterable<Book> all = bookRepository.findAll();
        all.forEach(a->{
            System.out.println(a);
        });
    }

自定义扩展查询

public interface BookRepository extends ElasticsearchRepository<Book,String> {
    //No property age found for type Book! Did you mean 'name'?
    List<Book> findByNameAndPrice(String name, BigDecimal price);
}

    /***
      * @description: https://docs.spring.io/spring-data/elasticsearch/docs/3.0.7.RELEASE/reference/html/#reference
      * @return: void
    **/
    @Test
    public void findNameAndAge(){
        List<Book> byNameAndPrice = bookRepository.findByNameAndPrice("ElasticSearch", BigDecimal.TEN);
        byNameAndPrice.forEach(a->{
            System.out.println(a);
        });
    }

分页

    @Test
    public void page() {
        //第1页
        int page = 1;
        //定义查询方式
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        //创建查询条件
        SearchQuery query = new NativeSearchQuery(matchAllQueryBuilder).setPageable(PageRequest.of(page - 1, 1));
        Page<Book> search = bookRepository.search(query);
        //处理结果
        System.out.println(search.getNumber());
        System.out.println(search.getTotalElements());
        System.out.println(search.getTotalPages());
        //直接遍历出page内的元素
        search.forEach(a -> {
            System.out.println(a);
        });
    }

复杂查询示例

    /***
     * @description: 条件查询,排序,分页
     **/
    @Test
    public void pageAndSort() {

        //排序字段
        FieldSortBuilder price = new FieldSortBuilder("price").order(SortOrder.DESC);
        //构建查询条件
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices("alibaba")
                .withTypes("book")
                .withQuery(QueryBuilders.matchAllQuery())
                .withSort(price)
                .withPageable(PageRequest.of(0, 2))
                .build();
        AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);
        //直接遍历出page内的元素
        books.forEach(a -> System.out.println(a));
    }
image.png

相关文章

网友评论

      本文标题:2-2 ES的API编码

      本文链接:https://www.haomeiwen.com/subject/sfqsrktx.html