Spring data Solr 使用笔记-1.HighlightPage的解析

Spring data Solr 使用笔记-1.HighlightPage的解析

solr的查询结果分为几种,HighlightPage,FacetPage,ScoredPage,GroupPage,StatsPage,这几个接口最终都是由SolrResultPage实现。

SolrResultPage基本的字段和构造方法继承自PageImpl->Chunk

HighlightPage的主要字段

content

content是个list,里面存放的是所有符合搜索条件的entity对象

Highlighted

Highlighted是一个List

一个HighlightEntry是一个Map,有两个键值对,一个“entity”键,对应一个相对应的entity对象,另一个键“hilights”,值是另一个HighlightEntry,也就是Map,这个map的两个键值对一个是"field":SimpleField,另一个是"snipplets":ArrayList,snipplets里存着每一条符合高亮条件的并经过前后缀拼接的字段内容

封装solr查询结果的过程

java后台获取到solr服务器的response后创建SolrResultPage实例的全过程

  1. solrTemplate的queryForHighlightPage()向solr发起查询,获得了QueryResponse response。
  2. 根据response 调用createSolrResultPage()方法
  3. 调用构造方法SolrResultPage(List content, Pageable pageable, long total, Float maxScore) 初始化SolrResultPage实例,返回调用者
  4. 使用ResultHelper.convertAndAddHighlightQueryResponseToResultPage()方法给返回的SolrResultPage实例Highlighted字段赋值
  5. 至此,HighlightPage查询结果完成

处理HighlightPage传输给页面

因为拼接过的字段内容存放在HighlightPage.highlighted[n].highlights[n].snipplets[n]
注:带[n]表示此对象是个集合,n表示索引。

页面取值不方便,所以我们需要先对结果进行处理

将查询结果entity对象里存放的未高亮字段内容替换为高亮后的内容

//对highlighted里的每一个map遍历
for (HighlightEntry<Item> highlightEntry : highlightPage.getHighlighted()) {
    //获得一个entity键对应的entity对象引用
    Item entity = highlightEntry.getEntity();
    if (highlightEntry.getHighlights().size()>0
        &&highlightEntry.getHighlights().get(0).getSnipplets().size()>0){
        /*获取当前循环的highlightEntry的highlights键对应的值,也是一个list,
        这个list的size跟高亮查询的字段数一致,只高亮一个字段则只有一个entry,获得这个entry,
        获得snipplets键对应的值,是一个list 我们直接获取0索引的string即是高亮处理过的内容
        由于我们已知高亮条件字段是title,所以直接setTitle*/
        entity.setTitle(highlightEntry.getHighlights().get(0).getSnipplets().get(0));
    }
}

你可能感兴趣的:(笔记,spring,data,solr)