pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
springboot 启动类
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.sxxjun.elasticsearchdemo.dao")
@EnableMongoRepositories(basePackages = "com.sxxjun.elasticsearchdemo.daodb")
public class ElasticSearchDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ElasticSearchDemoApplication.class, args);
}
}
配置类
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
ClientConfiguration configuration = ClientConfiguration.builder(
)
.connectedTo("127.0.0.1:9200")
// .withConnectTimeout(Duration.ofSeconds(5))
//.withSocketTimeout(Duration.ofSeconds(3))
//.useSsl()
//.withDefaultHeaders(defaultHeaders)
//.withBasicAuth(username, password)
// ... other options
.build();
RestHighLevelClient client = RestClients.create(configuration).rest();
return client;
}
}
bean
@Data
@Document(indexName = "dbsubject")
public class Subject implements Serializable {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String addr;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
private String desc;
private Long price;
}
dao
@Repository
public interface SubjectDao extends ElasticsearchRepository<Subject,String> {
}
service
@Service
public class SubjectServiceImpl implements SubjectService {
@Autowired
private SubjectDao subjectDao;
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
public Page<Subject> queryByName(String name){
// 构建查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.hasText(name)){
boolQueryBuilder.should(QueryBuilders.termQuery("name",name));
}
// 分页
PageRequest pageRequest = PageRequest.of(0,10);
// 高亮
HighlightBuilder highlightBuilder = getHighlightBuilder("name");
// 排序条件
FieldSortBuilder sortBuilder = SortBuilders.fieldSort("price").order(SortOrder.DESC);
// 组装条件
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withHighlightBuilder(highlightBuilder)
.withPageable(pageRequest)
.withSort(sortBuilder)
.build();
SearchHits<Subject> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, Subject.class);
// 高亮字段映射
List<Subject> userVoList = new ArrayList<>();
for (SearchHit<Subject> searchHit : searchHits) {
Subject content = searchHit.getContent();
Subject subject = new Subject();
BeanUtils.copyProperties(content,subject);
Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
for (String highlightField : highlightFields.keySet()) {
if (StringUtils.endsWithIgnoreCase(highlightField,"name")){
subject.setName(highlightFields.get(highlightField).get(0));
}
}
userVoList.add(subject);
}
// 组装分页对象
Page<Subject> userPage = new PageImpl<>(userVoList,pageRequest,searchHits.getTotalHits());
return userPage;
}
/**
* 高亮
* @param fields
* @return
*/
public HighlightBuilder getHighlightBuilder(String ... fields){
// 生成高亮查询器
HighlightBuilder highlightBuilder = new HighlightBuilder();
for (String field : fields) {
// 高亮查询字段
highlightBuilder.field(field);
}
// 如果多个字段高亮,这项要 false
highlightBuilder.requireFieldMatch(false);
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>");
//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片数
highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段
return highlightBuilder;
}
}