ElasticsearchTemplate初始化数据,计数,搜索和分页
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
实体类
import jdk.nashorn.internal.ir.annotations.Ignore;
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;
@Data
@Document(indexName = "house_index",type = "house_type",shards = 1,replicas = 1)
public class ESHouse {
@Id
private String id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String title;
@Field(type=FieldType.Keyword,index = false)
private String houseType;
@Field(type=FieldType.Keyword,index = false)
private String price;
@Field(type=FieldType.Keyword,index = false)
private String rentType;
@Field(type=FieldType.Keyword,index = false)
private String img;
@Field(type=FieldType.Keyword)
@Ignore
private String city;
}
service
public interface ElasticService {
boolean init();
long count(String city,String keyword);
List<ESHouse> selectByPage(String city,String keyword,int page,int size);
}
serviceImpl
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.stereotype.Service;
@Service
public class ElasticServiceImpl implements ElasticService {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private HouseDao houseDao;
@Override
public boolean init() {
try {
boolean result = elasticsearchTemplate.createIndex(ESHouse.class);
boolean result2 = elasticsearchTemplate.putMapping(ESHouse.class);
if(result&&result2){
List<House> list = houseDao.selectAll();
List<IndexQuery> listBulk = new ArrayList<>();
for(House house : list){
ESHouse esHouse = new ESHouse();
BeanUtils.copyProperties(house,esHouse);
esHouse.setImg(house.getImgs()[0]);
listBulk.add(new IndexQueryBuilder().withObject(esHouse).build());
}
elasticsearchTemplate.bulkIndex(listBulk);
return true;
}
} catch (BeansException e) {
e.printStackTrace();
}
return false;
}
@Override
public long count(String city, String keyword) {
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
List<QueryBuilder> list= new ArrayList<>();
list.add(QueryBuilders.matchPhraseQuery("city",city));
list.add(QueryBuilders.matchQuery("title",keyword));
boolQueryBuilder.must().addAll(list);
SearchQuery searchQuery = new NativeSearchQuery(boolQueryBuilder);
return elasticsearchTemplate.count(searchQuery,ESHouse.class);
}
@Override
public List<ESHouse> selectByPage(String city, String keyword,int page,int size) {
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
List<QueryBuilder> list= new ArrayList<>();
list.add(QueryBuilders.matchPhraseQuery("city",city));
list.add(QueryBuilders.matchQuery("title",keyword));
boolQueryBuilder.must().addAll(list);
SearchQuery searchQuery = new NativeSearchQuery(boolQueryBuilder);
searchQuery.setPageable(PageRequest.of(page,size));
return elasticsearchTemplate.queryForList(searchQuery,ESHouse.class);
}
}