ElasticsearchTemplate操作es

ElasticsearchTemplate操作es

Scroll Down

ElasticsearchTemplate操作es

elasticsearch与spring-data-elasticsearch版本对应
image.png
api参照:https://cloud.tencent.com/developer/article/1384050
但是由于版本的不同有新的语法。

1.创建索引

Template对象:


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;


/**
 * @ClassName: DrinkTemplate
 * @Description: * indexName="索引库的名字"
 * type:表名
 * shards:分片的数量,elasticsearch自动集群,默认一个数据放6个地方
 * replicas:备份
 * @author: XP
 */
@Document(indexName = "drink",replicas = 1,shards = 5,type = "drinking")
@Data
public class DrinkTemplate {
    @Id
    private Long id;
    /**
     *
      * @Author xp
      * Field 字段  FieldType.Text 文本(会被分词) FieldType.Keyword(关键词 不分词)
      *index = false 是否被索引
      *analyzer 分词器名称
      *
      **/
    @Field(index = true,type = FieldType.Text,analyzer = "ik_max_word")
    private String name;

    @Field(type = FieldType.Double)
    private Integer price;
    @Field(type = FieldType.Integer)
    private Integer sellCounts;
    @Field(index = false, type = FieldType.Keyword)
    private String imgUrl;
    @Field(type = FieldType.Keyword)
    private Integer cartId;

}

 @Test
    public void createIndex(){
        //创建索引(库)
        elasticsearchTemplate.createIndex("drink");
        //创建索引的类型 (表结构)
        elasticsearchTemplate.createIndex(DrinkTemplate.class);
    }

2.添加字段

   @Test
    public void putFiled(){
        //创建字段
        DrinkTemplate drinkTemplate = DrinkTemplate.builder().id(1L).cartId(7).imgUrl("666")
                                    .name("你好").price(5).sellCounts(5).build();
        //创建对应索引query对象完成对字段的记录
        IndexQuery indexQuery=new IndexQueryBuilder().
                withId(drinkTemplate.getId().toString()).
                withObject(drinkTemplate).build();
        //创建索引(创建表的一行数据)
        elasticsearchTemplate.index(indexQuery);
    }

image.png

image.png

3.查询

image.png

1.GetQuery(通过id查找)

 @Test
    public void getFiledByID(){
        //通过id字段进行查找
        GetQuery getQuery= new GetQuery();
        getQuery.setId("cake-1001");
        FoodTemplate foodTemplate = elasticsearchTemplate.queryForObject(getQuery, FoodTemplate.class);
        System.out.println(foodTemplate);
    }

2.matchQuery

matchQuery:会将你的内容分开进行模糊查询

  @Test
    public void getFiledBySearchQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 类似like
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("itemName","好吃" ))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

如果不想分开可以使用operator:

   @Test
    public void getFiledBySearchQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 类似like
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchQuery("itemName","好吃" ).operator(Operator.AND))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

可以进行经度匹配

    @Test
    public void getFiledBySearchQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 类似like
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchQuery("itemName","好吃" ).operator(Operator.AND).minimumShouldMatch("75%"))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

3.multiMatchQuery

multiMatchQuery:多字段查询

 @Test
    public void getFiledBySearchQueryMultiMatchQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 类似like
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery("cake-1001","imgUrl","itemId" ))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

3.matchPhraseQuery

matchPhraseQuery:短语匹配,不会对搜索内容进行分开

  @Test
    public void getFiledBySearchQueryMatchPhraseQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 类似like
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("itemName","好吃"))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

4.boolQuery

boolQuery:条件查询,可以进行多条件查询

 @Test
    public void getFiledBySearchQueryBoolQuery(){
        //设置分页
        PageRequest pageable = PageRequest.of(1, 10);
        //设置排序字段
        SortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.ASC);
        //设置query对象 与查询的参数 条件查询
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQuery().must(termQuery("itemName", "必备送人最佳")))
                .withPageable(pageable)
                .withSort(sortBuilder)
                .build();
        System.out.println(elasticsearchTemplate.queryForList(searchQuery, FoodTemplate.class));
    }

5.filter

查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:
1、查询:是在使用query进行查询时的执行环境,比如使用search的时候。
在查询上下文中,查询会回答这个问题——“这个文档是否匹配这个查询,它的相关度高么?”
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,对于某个搜索的分值计算还是需要一定的时间消耗。
2、过滤器:在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
在过滤器上下文中,查询会回答这个问题——“这个文档是否匹配?”
它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。