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

继上次匆匆搭建起结合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(搜索耗时)并相应的调整界面布局即可,效果如下:

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

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

邮箱:[email protected]

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

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

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

时间: 2024-10-06 06:55:35

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

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

继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大-- 简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧. 上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法.本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根

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

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将“*:*”改写为“title:安徽”,则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到那么炫,只要整到在solr的管

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

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将"*:*"改写为"title:安徽",则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到

新站SEO通过百度站内搜索建立索引之我见

虽说现在360搜索的势头非常强劲,但是百度凭借着高居50%以上的市场份额依旧是国内各大中小站长SEO最为重视的搜索引擎.然后,随着市场格局的不断变化,百度对站长的态度也越趋于明朗化,从推出站长平台到站内搜索,都在进一步的示好广大站长. 当然,想成为一名合格的SEOer,首先你必须对各主流搜索引擎的站长平台中所提供的工具了然于胸.然后,你才有资格在大家面前谈所谓的SEO.今天,鄙人也站在一位新手站长的角度,谈谈工具之一的百度站内搜索对于新站的好处. 一个站点,如果连索引量都建立不起来,然后你来跟我

基于lucene.net 和ICTCLAS2014的站内搜索的实现1

Lucene.net是一个搜索引擎的框架,它自身并不能实现搜索,需要我们自己在其中实现索引的建立,索引的查找.所有这些都是根据它自身提供的API来实现.Lucene.net本身是基于java的,但是经过翻译成.ne版本的,可以在ASP.net中使用这个来实现站内搜索. 要实现基于汉语的搜索引擎,首先的要实现汉语的分词.目前网上大部分都是利用已经有的盘古分词来实现的分词系统,但是盘古分词效果不太好.在这里我把最新的ICTCLAS2014嵌入到Lucene.net中.Lucene.net中所有的分词

Lucene.Net 站内搜索

Lucene.Net 站内搜索 一  全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们存数据取数据,并没有界面,可以看作一个数据库,只能对文本信息进行检索)Lucene.Net原理:把文本切词保存,然后根据词汇表的页来找到文章 二  分词算法: //一元分词算法(引用Lucene.Net.dll)  一元分词算法 //二元分词算法(CJK:China Japan Korean 需要再

一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)

前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客. 所以打算写个系类:<一步步搭建自己的博客> 一步步开发自己的博客  .NET版(1.页面布局.blog迁移.数据加载) 一步步开发自己的博客  .NET版(2.评论功能) 一步步开发自己的博客  .NET版(3.注册登录功能) 一步步开发自己

Lucene.net站内搜索1——SEO优化简介

声明:在这里,所谈的一切关于SEO的技术主要针对于我们开发人员. SEO (搜索引擎优化) SEO(搜索引擎优化)的目的(很多人都是通过搜索引擎找到我们的网站)是让搜索引擎更多的收录网站的页面,让被收录页面的权重更靠前,让更多的人能够通过搜索引擎进入这个网站 原理:蜘蛛会定时抓取网站的内容,发现网站内容变化.发现新增内容就反映到搜索引擎中 蜘蛛(spider) 爬网站:就是向网站发http get请求的客户端. SEO(搜索引擎优化*):让网站排名靠前,让网站更多的页面被搜索引擎收录.链接(外链

基于lucene.net 和ICTCLAS2014的站内搜索的实现2

分词系统建立完毕,这是基础也是核心,后面我们建立索引要用到分词系统. 下面依次讲解索引的建立,索引的查找. 分词系统建立完毕,这是基础也是核心,后面我们建立索引要用到分词系统.下面依次讲解索引的建立,索引的查找. 索引的建立采用的是倒排序,原理就是遍历所有的文本,对其进行分词,然后把分的词汇建立索引表.形式类似如下: 词汇          出现词汇的篇章1,篇章2,篇章3-- 建立索引的时候要注意这样的Document,Field这俩术语.Document代表的是一个文档,它里面包含一个或者多