前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在ssh中利用Solr服务建立的界面化站内搜索---solr2

在ssh中利用Solr服务建立的界面化站内搜索---solr2

作者头像
JackieZheng
发布于 2018-01-08 07:49:18
发布于 2018-01-08 07:49:18
86000
代码可运行
举报
文章被收录于专栏:JackieZhengJackieZheng
运行总次数:0
代码可运行

     继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大……

     简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧。

     上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法。本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根据关键字或规则到索引数据中寻找匹配项并返回结果到界面上。

    1.本篇的前提是你已经配置好nutch以及solr,并通过网页爬取将索引数据存放到了solr服务器中(solr可以可以部署到tomcat的下也可以不部署,另外我的所有搭建都是在Ubuntu环境下),我配置了中文分词器,以上工作可以在网上搜,资料很多,过程中也有很多错误需要解决,如果有时间我会对这块做个总结,solr服务器的界面如下:

接下来就是要做一个搜索界面,基于是一个纯所搜引擎,所以提供一个招牌、一个输入框以及一个确认按钮即可,关于招牌定什么,问过朋友,有吸引眼球的千度、谷哥哥,一看就是要和度娘们叫板,算了咱不干以卵击石的事,还是有点自知之明的好,最终还是叫“jiesearch”吧——小众,不矫情。这块不涉及什么代码量,所以就多扯了几句,界面如下:

    2.针对上次主题代码进行完善,因为上次返回的是一个SolrDocumentList 对象,不能直接转换为到jsp页面显示的list集合,所以借鉴网上前辈们的指点对代码进行了改写。

 //首先定义HttpSolrServer对象,用于程序连接solr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class SolrServer {
 2 private static SolrServer solrServer = null;
 3 private static HttpSolrServer server=null;
 4 private static String url="http://solrIP:8080/solr";
 5 
 6 public static synchronized SolrServer getInstance() {
 7      if (solrServer==null){
 8          solrServer=new SolrServer();
 9        }
10         return solrServer;
11 }
12 public static HttpSolrServer getServer(){
13     try {
14         if(server==null){
15             server = new HttpSolrServer(url);
16             server.setSoTimeout(1000); // socket read timeout
17             server.setConnectionTimeout(1000);
18             server.setDefaultMaxConnectionsPerHost(100);
19             server.setMaxTotalConnections(100);
20             server.setFollowRedirects(false); // defaults to false
21             //allowCompression defaults to false.
22             //Server side must support gzip or deflate for this to have any effect.
23             server.setAllowCompression(true);
24             server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
25             }
26       } catch (Exception e) {
27             // TODO Auto-generated catch block
28             e.printStackTrace();
29         }
30     return server;
31     }
32 }

//然后定义一个实体类BlogsDo用于接收和配置索引的各个字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 @Entity
 2 @Table(name="blogs")
 3 public class BlogsDO implements Serializable{
 4     private static final long serialVersionUID = -4721368786493126226L;
 5     @Field("Id")
 6     private String id;
 7     @Field("content")
 8     private String content;
 9     @Field("title")
10     private String title;
11     @Field("url")
12     private String url;
13     @Field("_version_")
14     private String _version_;
15     public String getId() {
16         return id;
17     }
18     public void setId(String id) {
19         this.id = id;
20     }
21     public String getContent() {
22         return content;
23     }
24     public void setContent(String content) {
25         this.content = content;
26      }
27     public String getTitle() {
28         return title;
29     }
30     public void setTitle(String title) {
31         this.title = title;
32     }
33     public String getUrl() {
34         return url;
35     }
36     public void setUrl(String url) {
37         this.url = url;
38     }
39     public String get_version_() {
40         return _version_;
41     }
42     public void set_version_(String version) {
43         _version_ = version;
44     }
45     public static long getSerialversionuid() {
46         return serialVersionUID;
47     }
48 }

备注:这些字段相应的都应该在schema.xml中存在<fields></fields>之间,如下所示,另外个人理解,对于实体类上的注解    @Field("")应该也是一种映射,就是将实体类的字段与配置文件中的选项相对应。

代码语言:js
AI代码解释
复制
<field name="id" type="string" stored="true" indexed="true"/>
<field name="_version_" type="long" indexed="true" stored="true"/> 
<!-- fields for index-basic plugin -->
<field name="url" type="url" stored="true" indexed="true"required="true"/>
<field name="content" type="text" stored="true" indexed="true"/>
<field name="title" type="text" stored="true" indexed="true"/>

//添加查询规则以及是否高亮的设置以及结果的返回与接收

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 String searchWord=request.getParameter("searchText");
 2 List<BlogsDO> blogList=new ArrayList<BlogsDO>();
 3 BlogsDO blogsDO=null;
 4 HttpSolrServer solrServer= SolrServer.getInstance().getServer();
 5 SolrQuery sQuery = new SolrQuery();
 6 String para="";
 7 Page page=null;
 8 para="content:"+searchWord+"";
 9 
10 logger.info("para:"+para);
11 sQuery.setQuery(para);
12 sQuery.setStart(0);
13 sQuery.setRows(10);
14 //设置高亮
15 sQuery.setHighlight(true); // 开启高亮组件
16 sQuery.addHighlightField("content");// 高亮字段
17 sQuery.addHighlightField("title");// 高亮字段
18 sQuery.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
19 sQuery.setHighlightSimplePost("</font>");//后缀
20 sQuery.setHighlightSnippets(2);//结果分片数,默认为1
21 sQuery.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
22 
23 //分片信息
24 sQuery.setFacet(true)
25 .setFacetMinCount(1)
26 .setFacetLimit(5)//段
27 .addFacetField("content");//分片字段
28 
29 long startSearch=System.currentTimeMillis();
30 Integer counts=0;
31 try {
32     QueryResponse response = solrServer.query(sQuery);
33     SolrDocumentList list = response.getResults();
34     counts=(int) list.getNumFound();//搜索数量
35     logger.info("counts:"+counts);
36     //获取所有高亮的字段
37     Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting();
38     String blogId="";
39     for (SolrDocument solrDocument : list) {
40     blogsDO=new BlogsDO();
41     blogId=(String) solrDocument.getFieldValue("id").toString();
42     blogsDO.setId(blogId);
43     blogsDO.set_version_(solrDocument.getFieldValue("_version_").toString());
44     blogsDO.setUrl(solrDocument.getFieldValue("url").toString());
45 
46     List<String> titleList=highlightMap.get(blogId).get("title");
47     List<String> contentList=highlightMap.get(blogId).get("content");
48     if(titleList!=null && titleList.size()>0){
49         blogsDO.setTitle(titleList.get(0));
50     }else{
51     //获取并设置高亮的字段title
52     blogsDO.setTitle(solrDocument.getFieldValue("title").toString());
53     }
54     if(contentList!=null && contentList.size()>0){
55         blogsDO.setContent(contentList.get(0));
56      }else{
57     //获取并设置高亮的字段content
58         blogsDO.setContent(solrDocument.getFieldValue("content").toString());
59     }
60     blogList.add(blogsDO);
61     }
62 } catch (SolrServerException e) {
63     e.printStackTrace();
64 }
65 long endSearch=System.currentTimeMillis();
66 model.addObject("time", (double)(endSearch-startSearch)/1000);
67 model.addObject("counts", counts);
68 model.addObject("blogList", blogList);

3.下面要做的就是在前台jsp页面中接收list集合和传过去的counts(搜索结果个数),time(搜索耗时)并相应的调整界面布局即可,效果如下:

     至此一个搜索引擎做的算是有点模样了,下一步如果还有时间可以对本地文档图片等建立索引并实现搜索功能。

    另外最近我在看大数据可视化方面的东西,如果有兴趣有见解的可以交流下

邮箱:zjhxp_1990@163.com

文中如有不足和错误还请指正!

    参考博文:http://blog.csdn.net/chunming8302/article/details/7321501

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-08-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设置网站运行时间
老猫-Leo
2023/12/11
2360
为主题用pugjs编写的hexo博客添加网站运行时间
然后把上述脚本添加到主题的layout/_partials/footer/footer.pug文件中(不同主题可能文件不一样,请自行参考)即可在网页底部显示网站运行时间了OvO,不过要注意修改一下var grt= new Date("08/13/2018 00:00:00");中的起始时间哦!
impressionyang
2020/08/26
8510
网站运行时间siteTime();
Dabenshi
2023/05/26
4410
JavaScript实现网站运行时间
看到很多的博客站点上都是有网站运行时间统计的代码,之前有学过JS语言,之后上网上借鉴了一下网上大佬写的代码。就是一个简单的运行时间的减法运算,才用了JS的事件函数,获取当前时间等等操作,最后给大家看一下代码及效果图片吧!
Meng小羽
2019/12/23
1.1K3
Fluid -4- 页脚增加网站运行时长
需要说明的是,如果将这个js 文件直接放在 hexo 目录的source 文件夹中,会报错无法渲染站点,此处有两种解决方案
为为为什么
2022/08/06
7130
Fluid -4- 页脚增加网站运行时长
为自己的博客添加运行时间
这篇文章最后修改于 2022-06-23 日,距今已有 152 天,请注意甄别内容是否已经过时!
羽翼博客
2022/11/28
3870
js 添加网站运行时间
<span id="sitetime"></span>  //js 调用 <script>     function siteTime(){         window.setTimeout("siteTime()", 1000);         var seconds = 1000;         var minutes = seconds * 60;         var hours = minutes * 60;         var days = hours * 24;         v
Savalone
2020/03/13
1.8K0
给网站添加本站运行天数
效果 站点 在主题配置里头黏贴 <div style="font-size: 0.85rem"> <span id="timeDate">载入天数...</span> <span id="times">载入时分秒...</span> <script src="/runtime.js"></script> JS代码 你需要新建一个runtime.js的文件(在网站根目录),并且修改起始日期。 /** 修改日期 2021/12/12 **/ /** 作者 张凯强,大白熊修改 **/ /** 网站 bl
大白熊
2021/12/23
9120
给网站添加本站运行天数
网站自定义运行时间和当前时间和天气代码
代码如下,附在网页代码即可。文字可适当修改,自测。 <script language=javascript> function siteTime(){ window.setTimeout("siteTime()", 1000); var seconds = 1000 var minutes = seconds * 60 var hours = minutes * 60
Lcry
2022/11/29
7260
网站自定义运行时间和当前时间和天气代码
自建Alist共享网盘网站
一、背景 由于百度网盘下载限速,所以就用了天翼云,坚果云,阿里云等,结果每次都要登录,就很拉跨, 所以在这里部署一套共享alist网盘,实现随时随地,只要有网,开箱即用。 二、docker部署 官方地址 1.安装 # 端口自定义即可 docker run -d --restart=always -v /etc/alist:/opt/alist/data -p 5244:5244 --name="alist" xhofe/alist:latest 2.密码化密码 docker exec -it alis
懿曲折扇情
2022/09/06
3.4K0
自建Alist共享网盘网站
Typecho博客网站底部添加网站已运行时间教程
样式一: 1. 将代码放入 functions.php 一般在主题根目录:网站 /usr/themes/ 主题 修改一下你自己的网站时间 // 设置时区 date_default_timezone_set('Asia/Shanghai'); /** * 秒转时间,格式 年 月 日 时 分 秒 * */ function getBuildTime() { // 在下面按格式输入本站创建的时间 $site_create
季春二九
2023/03/22
7250
前端技术前沿8
实现倒计时(天数、时、分、秒) parseInt() 函数可解析一个字符串,并返回一个整数。 <body onload="leftTimer()"> <h2>剩余时间:</h2> <div id="timer"></div> </body> <script language="javascript" type="text/javascript"> function leftTimer(year,month,day,hour,minute,second){ var leftTime =
达达前端
2019/07/03
5.8K0
前端技术前沿8
仅用18行JavaScript构建一个倒数计时器
因此,事不宜迟,这里介绍了如何仅用18行JavaScript来制作自己的倒计时时钟。
Lemon黄
2020/06/04
3K0
仅用18行JavaScript构建一个倒数计时器
博客底部代码
说明: 刚刚凭借自己仅有的css知识去改了以下单调的博客底部,现在已经好看多啦,效果如下
meowrain
2021/04/22
1.2K0
博客底部代码
「  【WEB】给你的网站增加运行时间代码  」
时候觉得添加一些东西还是挺好玩的,比如在网站底部加一个运行时间代码还是挺好玩的 <center> 今天是:<span><script language=Javascript type=text/Javascript> var day=""; var month=""; var ampm=""; var ampmhour=""; var myweekday=""; var year=""; mydate=new Date(); myweekday=mydate.getDay(); mymo
青益
2023/01/03
9330
网站如何加入显示运行时间
世间万物皆苦,你明目张胆的偏爱就是救赎。 网站加入运行时间精确到秒 把下面代码加到你需要的地方,很简单的,我还是比较喜欢这样的个性代码的 <span id="runtime_span"></span> <script type="text/javascript"> function show_runtime() {window.setTimeout("show_runtime()",1000); X=new Date("10/16/2017 5:22:00"); Y=new Date(); T=(Y.
白黎
2023/03/16
7430
网站如何加入显示运行时间
实战|仅用18行JavaScript构建一个倒数计时器
有时候,你会需要构建一个 JavaScript 倒计时时钟。你可能会有一个活动、一个销售、一个促销或一个游戏。你可以用原生的 JavaScript 构建一个时钟,而不是去找一个插件。尽管有很多很棒的时钟插件,但是使用原生 JavaScript 可以带来以下好处:
张张
2020/09/18
4.2K0
实战|仅用18行JavaScript构建一个倒数计时器
7b2美化-网站底部添加运行时间
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
小狐狸说事
2022/11/17
5910
7b2美化-网站底部添加运行时间
如何写一个js指定时间倒计时
更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120055675
马克社区
2022/07/15
6960
「JavaScript」编程练习题
请注意,本文编写于 2097 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
4660
推荐阅读
相关推荐
设置网站运行时间
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验