基于Spring-Boot框架的Elasticsearch搜索服务器配置

一、相关包maven配置

1  <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch -->
2         <dependency>
3             <groupId>org.springframework.data</groupId>
4             <artifactId>spring-data-elasticsearch</artifactId>
5             <version>1.3.6.RELEASE</version>
6         </dependency>    

spring-boot  1.3.8.RELEASE能支持配置注解故,elasticsearch的配置可以在 xxx.properties文件中配置

# ELASTICSEARCH (ElasticsearchProperties)
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.9.8.222:9300
spring.data.elasticsearch.repositories.enabled=true

这样可以通过框架自动注入实例化类

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

二、处理ES返回数据

获取搜索内容:

 1     // 空条件查询默认匹配全部
 2         NativeSearchQueryBuilder nsbIndex = new NativeSearchQueryBuilder();
 3         MatchAllQueryBuilder qbIndex = QueryBuilders.matchAllQuery();
 4         
 5         // 设置分页参数
 6         Pageable pageable = new PageRequest(page, limit);
 7         nsbIndex.withPageable(pageable);
 8         nsbIndex.withQuery(qbIndex);
 9         SearchQuery searchQuery = nsbIndex.build(); 
10         Page<IndexSearch> pageIndexes = null;
11         try {
12             pageIndexes = elasticsearchTemplate.queryForPage(searchQuery, IndexSearch.class, new ElasticsearchResultMapper(heightFields));
13         } catch (Exception e) {
14             throw new YMLibWebApplicationException("搜索条件为空,查询全部文献出错,出错原因:" + e.getMessage(), e);
15         }
16        List<IndexSearch> indexes = pageIndexes.getContent();
17        .......

处理个性化设置类,如高亮显示属性:

上图红色部分类是一个个性化设置类,继承重写了SearchResultMapper 的mapResults方法

 1 public class ElasticsearchResultMapper implements SearchResultMapper {
 2     private static Logger log = LoggerFactory.getLogger(ElasticsearchResultMapper.class);
 3     
 4     private final List<String> heightFields = new ArrayList<String>();
 5     
 6     public ElasticsearchResultMapper(){
 7         
 8     }
 9     
10     public ElasticsearchResultMapper(List<String> heightFields){
11         this.heightFields.addAll(heightFields);
12     }
13 
14     @Override
15     public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
16         // TODO Auto-generated method stub
17         // 将返回的结果标记指定的属性高亮显示
18         List<Object> chunk = setHighlightFieldsForSearchHits(response, heightFields);
19         // 该搜索条件总共命中多少条数据
20         long totalHits = response.getHits().totalHits();
21         // System.out.println("totalHits = "+totalHits);
22         return new FacetedPageImpl((List<T>) chunk, pageable, totalHits);
23     }
24     
25     
26     /**
27      * 
28      * @remark:[]
29      * @author:hoojjack
30      * @Description:TODO(对返回的结果设置高亮属性)
31      */
32     public List<Object> setHighlightFieldsForSearchHits(@NotNull SearchResponse response,
33             @NotNull final List<String> heightFields) {
34         if (0 == heightFields.size()) {
35             System.out.println("heightFields不能为空");
36             return null;
37         }
38         List<Object> chunk = new ArrayList<Object>();
39         for (SearchHit searchHit : response.getHits()) {
40             // 打印出_score
41 //            System.out.println("searchHitScore = " + searchHit.getScore() + "searchHitSource=" + searchHit.getSource());
42             if (response.getHits().getHits().length <= 0) {
43                 log.info("未命中搜索结果");
44                 return null;
45             }
46             Map<String, Object> entityMap = searchHit.getSource();
47             if (null == entityMap) {
48                 log.error("搜索返回的结果中无_source属性值");
49                 entityMap = new HashMap<String, Object>();
50             }
51             for (String highName : heightFields) {
52                 //枚举类型属性不能标亮显示,标亮显示会多久一些标识,导致找不到相对应的枚举类型
53                 if("literClassfication".equals(highName)){
54                     continue;
55                 }
56                 if (null != searchHit.getHighlightFields().get(highName)) {
57                     Text text[] = searchHit.getHighlightFields().get(highName).fragments();
58                     if (text.length > 0) {
59                         String highValue = searchHit.getHighlightFields().get(highName).fragments()[0].toString();
60                         entityMap.put(highName, highValue);
61                     }
62                 }
63             }
64             chunk.add(entityMap);
65         }
66         return chunk;
67     }
68 
69 }

以上只是学习的一部分记录,随着学习的深入,再继续更新!

原文地址:https://www.cnblogs.com/hoojjack/p/8427595.html