版本
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()); }