zoukankan      html  css  js  c++  java
  • 基于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 }

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

  • 相关阅读:
    无线鼠标换电池了
    Jython Interactive Servlet Console YOU WILL NEVER KNOW IT EXECLLENT!!! GOOD
    Accessing Jython from Java Without Using jythonc
    jython podcast cool isnt't it?
    Python里pycurl使用记录
    Creating an Interactive JRuby Console for the Eclipse Environment
    微软为AJAX和jQuery类库提供CDN服务
    Download A File Using Cygwin and cURL
    What is JMRI?这个是做什么用的,我真没看懂但看着又很强大
    用curl 发送指定的大cookie的http/https request
  • 原文地址:https://www.cnblogs.com/hoojjack/p/8427595.html
Copyright © 2011-2022 走看看