项目中如何使用solr(续)--高亮

项目中如何使用solr

中已经介绍了如何在项目中使用solr

今天再完善一下,把查询集成进去

我们对之前的文章进行了重新设计


import java.util.Date;

import org.apache.solr.client.solrj.beans.Field;

/**
 * solr中保存的文章
 * 
 * @author 程高伟
 * @time 2017年5月7日下午7:51:23
 */
public class ArticleSolr {
    // 文章id
    @Field
    private String id;
    // 文章分类名称
    @Field
    private String category;
    // 作者姓名
    @Field
    private String author;
    // 文章标题
    @Field
    private String title;
    // 文章内容
    @Field
    private String content;
    // 发布时间
    @Field
    private Date createTime;
    // 阅读量
    @Field
    private Integer readCount;
    // 评论量
    @Field
    private Integer commentCount;
    // 省去getter setter toString方法
}

现在我们在solr 控制台对之前定义的solr类型进行重新定义

这里写图片描述

在这个页面可以修改solr中的数据类型

我们添加一下文章分类,这个也是需要进行中文分词的数据类型选择text_ik

这里写图片描述

依次建立相应的字段(除了需要中文分词的类型为text_ik外,其他的比如时间可选选择date类型,阅读量可以选择int类型)

所有字段都可以在managed-schema中看到

这里写图片描述

好了,现在数据类型已经建立了,模型也定义好了。

我们插入一条测试数据

    ArticleSolr article = new ArticleSolr();
        article.setId("123456");
        article.setTitle("项目中如何使用solr");
        article.setAuthor("程高伟");
        article.setCategory("solr");
        article.setContent("之前写过solr的系列文章,包括对官方文档的学习和solrj的使用,但是今天想在项目中使用却发现很难将所有的知识点串联起来...");
        article.setCreateTime(new Date());
        article.setReadCount(189);
        article.setCommentCount(2);
        SolrUtil.saveSolrResource(article);

我们进入控制台

已经看到添加的数据了

这里写图片描述

我依次把我博客中的下面八篇文章添加进去

这里写图片描述

添加完成以后我们写一个controller

这个controller很简单就是根据用户的关键词调用solr搜索,返回结果

/**
 * 搜索
 * 
 * @author 程高伟
 * @time 2017年5月7日下午8:27:35
 */
@Controller
public class SearchController {
    @RequestMapping(value = "/search", method = RequestMethod.GET)
    public String search(String keywords, Model model) throws SolrServerException, IOException {
        List<ArticleSolr> articleList = SolrUtil.queryHighlight(keywords);
        model.addAttribute("articleList", articleList);
        return "admin/article/search";
    }

}

高亮的代码

public static List<ArticleSolr> queryHighlight(String keywords) throws SolrServerException, IOException {
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery("title:" + keywords + "or content:" + keywords+ "or author:" + keywords+ "or category:" + keywords); // 设置查询关键字
        solrQuery.setHighlight(true); // 开启高亮
        solrQuery.addHighlightField("title"); // 高亮字段
        solrQuery.addHighlightField("content"); // 高亮字段
        solrQuery.setHighlightSimplePre("<font color='red'>"); // 高亮单词的前缀
        solrQuery.setHighlightSimplePost("</font>"); // 高亮单词的后缀
        solrQuery.setSort("createTime", ORDER.desc); // 按照文章的发布时间排序
        /**
         * hl.snippets
         * hl.snippets参数是返回高亮摘要的段数,因为我们的文本一般都比较长,含有搜索关键字的地方有多处,如果hl.snippets的值大于1的话,
         * 会返回多个摘要信息,即文本中含有关键字的几段话,默认值为1,返回含关键字最多的一段描述。solr会对多个段进行排序。
         * hl.fragsize
         * hl.fragsize参数是摘要信息的长度。默认值是100,这个长度是出现关键字的位置向前移6个字符,再往后100个字符,取这一段文本。
         */
        solrQuery.setHighlightFragsize(100);
        QueryResponse query = client.query(solrQuery);
        List<ArticleSolr> articleList = query.getBeans(ArticleSolr.class);
        // System.out.println(query.getResponse().get("highlighting"));
        Map<String, Map<String, List<String>>> highlightresult = query.getHighlighting();
        // System.out.println(highlightresult);
        for (int i = 0; i < articleList.size(); ++i) {
            // System.out.println("文章:"+articleList.get(i));
            String id = articleList.get(i).getId();
            if (highlightresult.get(id) != null && highlightresult.get(id).get("title") != null) {
                articleList.get(i).setTitle(highlightresult.get(id).get("title").get(0));
            }
            if (highlightresult.get(id) != null && highlightresult.get(id).get("content") != null) {
                articleList.get(i).setContent(highlightresult.get(id).get("content").get(0));
            }
        }
        return articleList;
    }

最后的页面

<div class="dataTable_wrapper">
                                <table class="table table-striped table-bordered table-hover"
                                    id="dataTables-example">
                                    <thead>
                                        <tr>
                                            <th>文章名称</th>
                                            <th>文章内容</th>
                                            <th>发布日期</th>
                                            <th>操作</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <c:forEach items="${articleList }" var="article" varStatus="status">
                                            <tr>
                                                <td>${article.title }</td>
                                                <td>${article.content }</td>
                                                <td><fmt:formatDate value="${article.createTime }" type="date" pattern="yyyy-MM-dd HH:mm:ss"/></td>
                                                <td>
                                                    <a href="${ctx }/blog/${article.id }" class="btn btn-outline btn-primary btn-xs btn-preview"><i class="fa fa-file-text-o"></i> 预览</a>
                                                </td>
                                            </tr>
                                        </c:forEach>
                                    </tbody>
                                </table>
                            </div>

效果

搜索Spring Boot的高亮显示

这里写图片描述

微信公众号的高亮以及分词效果

这里写图片描述

不要在意这里的分页,这里的分页是datatables的分页,与solr无关。

已标记关键词 清除标记
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除,从账户取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJBJNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除,从账户取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJBJNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Jav
相关推荐
当数据量达到TB或PB级的时候,传统关系型数据型已力不从心。在大数据热潮,推出了NoSQL数据库,这种天生就为分布式存储而设计的技术,尤其以Apache HBase为代表,占领海量数据存储技术的大半壁江山。本教视从实战角度出来,向学员们手把手掌握HBase使用精髓,让学员达到如下目标: 1. 了解分布式存储的原理及架构。 2. 掌握如何使用HBase实现海量数据存储与检索。 3. 掌握HBase在开发常见的技术大坑与调优技术。 课时1:HBase简介与部署 课时2:HBase架构与索引算法剖析 课时3:HBase建库建表与CRUD实战 课时4:基于HBase Client API的CRUD实战 课时5:批处理与扫描器实战 课时6:使用Ganglia监控HBase 课时7:过滤器实战之比较过滤器 课时8:过滤器实战之专用过滤器与FilterList 课时9:过滤器实战之自定义过滤器 课时10:Observer协处理器实战之Master级别原理剖析 课时11:Observer协处理器实战之Region级别原理剖析 课时12:Observer协处理器实战之表复制应用实战 课时13:Endpoint协处理器实战之原理剖析 课时14:Endpoint协处理器实战之数据统计应用实战 课时15:使用API管理HBase之核心理论 课时16:使用API管理HBase之编程实战 课时17:使用API管理HBase之编程实战() 课时18:搭建分布式HBase集群之Hadoop部署 课时19:搭建分布式HBase集群之HBase部署 课时20:sqoop2部署 课时21:使用sqoop2将mysql数据导入到HBase 课时22:集群管理之节点管理与数据任务 课时23:Rowkey设计与集群常见故障处理 课时24:集群调优经验分享 课时25:项目介绍与Solr环境搭建 课时26:数据层设计与文分词器配置 课时27:Spring集成HBase之核心操作 课时28:Spring集成HBase之核心操作() 课时29:基于dom4j进行数据文件解析 课时30:数据层设计与实现之二级索引开发 课时31:数据层设计与实现之二级索引开发() 课时32:Spring集成Solrj之入门操作 课时33:Spring集成Solrj之高级操作 课时34:高亮查询功能开发之一 课时35:高亮查询功能开发之二 课时36:课程总结
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页