继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大……
 
     简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧。
 
     上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法。本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根据关键字或规则到索引数据中寻找匹配项并返回结果到界面上。
 
    1.本篇的前提是你已经配置好nutch以及solr,并通过网页爬取将索引数据存放到了solr服务器中(solr可以可以部署到tomcat的下也可以不部署,另外我的所有搭建都是在Ubuntu环境下),我配置了中文分词器,以上工作可以在网上搜,资料很多,过程中也有很多错误需要解决,如果有时间我会对这块做个总结,solr服务器的界面如下:
 
接下来就是要做一个搜索界面,基于是一个纯所搜引擎,所以提供一个招牌、一个输入框以及一个确认按钮即可,关于招牌定什么,问过朋友,有吸引眼球的千度、谷哥哥,一看就是要和度娘们叫板,算了咱不干以卵击石的事,还是有点自知之明的好,最终还是叫“jiesearch”吧——小众,不矫情。这块不涉及什么代码量,所以就多扯了几句,界面如下:
 
    2.针对上次主题代码进行完善,因为上次返回的是一个SolrDocumentList 对象,不能直接转换为到jsp页面显示的list集合,所以借鉴网上前辈们的指点对代码进行了改写。
 //首先定义HttpSolrServer对象,用于程序连接solr
 public class SolrServer {
private static SolrServer solrServer = null;
private static HttpSolrServer server=null;
private static String url="http://solrIP:8080/solr"; public static synchronized SolrServer getInstance() {
if (solrServer==null){
solrServer=new SolrServer();
}
return solrServer;
}
public static HttpSolrServer getServer(){
try {
if(server==null){
server = new HttpSolrServer(url);
server.setSoTimeout(1000); // socket read timeout
server.setConnectionTimeout(1000);
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false); // defaults to false
//allowCompression defaults to false.
//Server side must support gzip or deflate for this to have any effect.
server.setAllowCompression(true);
server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return server;
}
}
 
//然后定义一个实体类BlogsDo用于接收和配置索引的各个字段
 @Entity
@Table(name="blogs")
public class BlogsDO implements Serializable{
private static final long serialVersionUID = -4721368786493126226L;
@Field("Id")
private String id;
@Field("content")
private String content;
@Field("title")
private String title;
@Field("url")
private String url;
@Field("_version_")
private String _version_;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String get_version_() {
return _version_;
}
public void set_version_(String version) {
_version_ = version;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
备注:这些字段相应的都应该在schema.xml中存在<fields></fields>之间,如下所示,另外个人理解,对于实体类上的注解    @Field("")应该也是一种映射,就是将实体类的字段与配置文件中的选项相对应。
<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"/>
 
//添加查询规则以及是否高亮的设置以及结果的返回与接收
 String searchWord=request.getParameter("searchText");
List<BlogsDO> blogList=new ArrayList<BlogsDO>();
BlogsDO blogsDO=null;
HttpSolrServer solrServer= SolrServer.getInstance().getServer();
SolrQuery sQuery = new SolrQuery();
String para="";
Page page=null;
para="content:"+searchWord+""; logger.info("para:"+para);
sQuery.setQuery(para);
sQuery.setStart(0);
sQuery.setRows(10);
//设置高亮
sQuery.setHighlight(true); // 开启高亮组件
sQuery.addHighlightField("content");// 高亮字段
sQuery.addHighlightField("title");// 高亮字段
sQuery.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
sQuery.setHighlightSimplePost("</font>");//后缀
sQuery.setHighlightSnippets(2);//结果分片数,默认为1
sQuery.setHighlightFragsize(1000);//每个分片的最大长度,默认为100 //分片信息
sQuery.setFacet(true)
.setFacetMinCount(1)
.setFacetLimit(5)//段
.addFacetField("content");//分片字段 long startSearch=System.currentTimeMillis();
Integer counts=0;
try {
QueryResponse response = solrServer.query(sQuery);
SolrDocumentList list = response.getResults();
counts=(int) list.getNumFound();//搜索数量
logger.info("counts:"+counts);
//获取所有高亮的字段
Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting();
String blogId="";
for (SolrDocument solrDocument : list) {
blogsDO=new BlogsDO();
blogId=(String) solrDocument.getFieldValue("id").toString();
blogsDO.setId(blogId);
blogsDO.set_version_(solrDocument.getFieldValue("_version_").toString());
blogsDO.setUrl(solrDocument.getFieldValue("url").toString()); List<String> titleList=highlightMap.get(blogId).get("title");
List<String> contentList=highlightMap.get(blogId).get("content");
if(titleList!=null && titleList.size()>0){
blogsDO.setTitle(titleList.get(0));
}else{
//获取并设置高亮的字段title
blogsDO.setTitle(solrDocument.getFieldValue("title").toString());
}
if(contentList!=null && contentList.size()>0){
blogsDO.setContent(contentList.get(0));
}else{
//获取并设置高亮的字段content
blogsDO.setContent(solrDocument.getFieldValue("content").toString());
}
blogList.add(blogsDO);
}
} catch (SolrServerException e) {
e.printStackTrace();
}
long endSearch=System.currentTimeMillis();
model.addObject("time", (double)(endSearch-startSearch)/1000);
model.addObject("counts", counts);
model.addObject("blogList", blogList);
3.下面要做的就是在前台jsp页面中接收list集合和传过去的counts(搜索结果个数),time(搜索耗时)并相应的调整界面布局即可,效果如下:
 
     至此一个搜索引擎做的算是有点模样了,下一步如果还有时间可以对本地文档图片等建立索引并实现搜索功能。
 
    另外最近我在看大数据可视化方面的东西,如果有兴趣有见解的可以交流下
邮箱:zjhxp_1990@163.com
文中如有不足和错误还请指正!
 
    参考博文:http://blog.csdn.net/chunming8302/article/details/7321501
 

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                          2. 微信

                      

在ssh中利用Solr服务建立的界面化站内搜索---solr2的更多相关文章

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

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

  2. 利用Solr服务建立的站内搜索雏形---solr1

    最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下, ...

  3. 利用Solr服务建立的站内搜索雏形

    最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下, ...

  4. JAVAEE——宜立方商城07:Linux上搭建Solr服务、数据库导入索引库、搜索功能的实现

    1. 学习计划 1.Solr服务搭建 2.Solrj使用测试 3.把数据库中的数据导入索引库 4.搜索功能的实现 2. Solr服务搭建 2.1. Solr的环境 Solr是java开发. 需要安装j ...

  5. Django之站内搜索-Solr,Haystack

    java -version 不多说 solr 是java 开发的 java version "1.7.0_79" Java(TM) SE Runtime Environment ( ...

  6. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  7. J2EE进阶(七)利用SSH框架根据数据表建立model类

    J2EE进阶(七)利用SSH框架根据数据表建立model类 前言 在利用SSH框架进行项目开发时,若将数据库已经建好,并且数据表之间的依赖关系已经确定,可以利用Hibernate的反转功能进行mode ...

  8. 【C#】教你纯手工用C#实现SSH协议作为GIT服务端

    SSH(Secure Shell)是一种工作在应用层和传输层上的安全协议,能在非安全通道上建立安全通道.提供身份认证.密钥更新.数据校验.通道复用等功能,同时具有良好的可扩展性.本文从SSH的架构开始 ...

  9. 利用solr实现商品的搜索功能

      后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据 ...

随机推荐

  1. pthread——pthread_cleanup

    Pthread_cleanup用于注册线程清理函数,注册的清理函数将在线程被取消或者主动调用pthread_exit时被调用:     一个简单的示例: #include <pthread.h& ...

  2. ORACLE10g创建表空间,角色与授权

    创建基础表空间,创建用户,授权. -- CREATE TABLESPACE CREATE TABLESPACE TS_JK_LAB_BASIC DATAFILE 'D:\TOOLS\ORACLE\PR ...

  3. Apache HTTP Server 2.2.26 发布

    Apache遗留产品线2.2.26发布.2013-11-13 之前的版本是2013-07-02的2.2.25 同样先在开发目录下放出下载,然后放到正式目录下.修正了大量的Bug.目前的稳定版2.4系列 ...

  4. 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)

    在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多.但是 ...

  5. 一个不陌生的JS效果-marquee,用css3来实现

    关于marquee,就不多说了,可以戳这里. 毕竟他是一个很古老的元素,现在的标准里头也不推荐使用这个标签了.但平时一些项目中会经常碰到这样的效果,每次都是重新写一遍,麻烦! JS类实现marquee ...

  6. http学习笔记(二)—— 嘿!伙计,你在哪?(URL)

    我们之所以希望浏览网页,其中一个重要的原因就是庞大的web世界中有很丰富的资源,他就像哆啦a梦的口袋,随时都能拿出我们想要的宝贝.这些资源通过http被传送到我们的浏览器,并展示到我们的屏幕上.而我们 ...

  7. ECMAScript5 Array新增方法

    数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Arr ...

  8. Linux gcc的安装

    说明:我是在虚拟机里学习的Linux,很多问题也是和虚拟机有关的.今天就遇到了虚拟机安装gcc是一个问题. 首先查看gcc是否安装: 然后安装gcc.(我的错误就出现在这里.) 我用的虚拟机,练习平时 ...

  9. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

  10. 翻译:AKKA笔记 - 介绍Actors

    任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...