spring-boot集成elasticsearch

版本

java1.8 elasticsearch6.8 spring boot2.1.4 ik6.8

pom
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
启动时异常

nested exception is java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]

启动类插入下面代码

static {
       System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
dao

dao继承ElasticsearchRepository 

 启动类添加包扫描

@EnableElasticsearchRepositories(basePackages = {"com.aipinto.ams.esdao"})
创建索引 映射

用到的实体类

package com.aipinto.ams.dmo.elasticsearch;

import org.elasticsearch.common.geo.GeoPoint;
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 org.springframework.data.elasticsearch.annotations.GeoPointField;

import java.util.List;

//        索引库名字 不要用大写             类型随便起 不要用大写
@Document(indexName = "hotel", type = "docs")
public class ElasticsearchHotelDmo {
    
    @Id // 对应esID
    @Field(type = FieldType.Keyword) // 字段用于精确搜索或者排序使用keyword,默认无索引
    private String id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word") // Text会自动建立索引,analyzer指定分词器 这里使用 ik最小细度分词
    private String brand;

    
    @Field(type = FieldType.Text, analyzer = "ik_max_word") // es支持数组,但是类型要保持一样
    private List<String> keywords;

    @GeoPointField
    private GeoPoint location; // es支持经纬度搜索

    
    @Field(type = FieldType.Long)
    private Long price;


    @Field(type = FieldType.Integer)
    private Integer SystemSort;

}

创建索引和映射

    @Resource
     private ElasticsearchTemplate elasticsearchTemplate;

    @Test
     public void test() {
        elasticsearchTemplate.createIndex(ElasticsearchHotelDmo.class);
        elasticsearchTemplate.putMapping(ElasticsearchHotelDmo.class);
    }
添加
elasticsearchHotelDao.save( ElasticsearchHotelDmo )
删除
elasticsearchHotelDao.deleteById();
搜索接口service
private void serach() {
        // 构建原生搜索器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // boolean查询,用于多条件
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        // should相当于or关系; termQuery的机制是:直接去匹配token。
        boolQuery.should(QueryBuilders.termQuery("",""));
        // matchQuery的机制是:先检查字段类型是否是analyzed,如果是,则先分词,再去去匹配;如果不是,则直接去匹配
        // boolQuery.should(QueryBuilders.matchQuery("",""));
        // boolQuery.filter(); // filter过滤
        // boolQuery.must(); // must相当于and关系
        // boolQuery.mustNot(); // mustNot不包含
        queryBuilder.withQuery(boolQuery);
        // withFilter过滤匹配上的 geoDistanceQuery距离搜索 location mapper字段名 point(double lat, double lon) lat维度 lon经度 distance(String distance, DistanceUnit unit) distance距离 unit单位
        queryBuilder.withFilter(QueryBuilders.geoDistanceQuery("location").point(1, 1).distance("3", DistanceUnit.KILOMETERS));
        // withQuery 正常查询按命中率排序 rangeQuery(String name)区间搜索 name mapper你要搜索的字段 get大于等于 ge大于 lte小于等于 lt小于
        queryBuilder.withQuery(QueryBuilders.rangeQuery("price").gte(100).lte(500));
        // withSort排序 fieldSort(String field) field排序的字段 order(SortOrder order)降序还是升序
        queryBuilder.withSort(SortBuilders.fieldSort("SystemSort").order(SortOrder.DESC));
        // 分页  PageRequest of(int page, int size) 当前页 条数 es第一页是0不是1
        queryBuilder.withPageable(PageRequest.of(0, 10));
        // 结果
        Page<ElasticsearchHotelDmo> search = elasticsearchHotelDao.search(queryBuilder.build());
    }

 

猜你喜欢

转载自www.cnblogs.com/adfaf/p/12133873.html