• 基于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 }

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

  • 相关阅读:
    Django: 项目实战从0开始---实现登录注册系统。(7)
    Django: 项目实战从0开始---实现登录注册系统。(6)
    Django: 项目实战从0开始---实现登录注册系统。(5)
    Django: 项目实战从0开始---实现登录注册系统。(4)
    Django: 项目实战从0开始---实现登录注册系统。(3)
    Django: 项目实战从0开始---实现登录注册系统。(2)
    Django: 项目实战从0开始---实现登录注册系统。(1)
    Centos 7: Python3运维脚本(查看服务器信息并发送邮件)
    vue 错误记录
    ide 下spingboot 实现热部署
  • 原文地址:https://www.cnblogs.com/hoojjack/p/8427595.html
Copyright © 2020-2023  润新知