day59_nutch&solr

1 solr与lucene的比较

1. 1Solr 是什么?

Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务
器通信使用标准的HTTP 和XML,所以如果使用Solr 了解Java 技术会有用却不是必须的要
求。
Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和
电子文档(Word,PDF 等)的处理。而且Solr 具有高度的可扩展,支持分布搜索和索引的
复制。

1.2 Lucene 是什么?

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,
而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个
开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于 Lucene ,比如 Eclipse 帮助系统的搜索功
能。Lucene 能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文
本格式,Lucene 就能对你的文档进行索引和搜索。

1.3 Solr VS Lucene

Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr 底层
的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要
注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于
Lucene。

2 Solr 的搭建运行

1、解压solr-4.6.0.zip到你想到存放的路径,比如:e:/solr
2、cmd打开命令行窗口,进入E:/solr/example目录
3、执行命令:java -jar start.jar
4、通过第三步以后,系统会启动solr自带的jetty服务器,通过 http://localhost:8983/solr/便可访问solr。
此时,solr已成功启动

3 索引维护

3.1 创建索引

此时solr已安装并启动,但是还没有索引,只有创建好索引,搜索才能有结果

1、cmd进入/solr/example/exampledocs目录
2、执行命令:java -jar post.jar solr.xml monitor.xml,此时你已成功提交了2个solr文档
3、执行完第二步后,我们可以通过浏览器访问:http://localhost:8983/solr/collection1/select?q=solr&wt=xml

如果你想导入更多的文档,执行命令:java -jar post.jar *.xml

3.2 更新索引

当你重复执行命令:java -jar post.jar *.xml后,发现搜索的结果没有出现重复的数据,原因:example目录下的schema.xml中指定了列id为uniqueKey(即:唯一),所以当你重复提交数据到索引库时,id相同的数据会替换原来document中的数据。
如果你想要得到重复的数据,你可以通过修改exampledocs目录下*.xml中id值的方式实现

3.3 删除索引

1、执行命 令:java -Ddata=args -Dcommit=false -jar post.jar “SP2514N”,可以删除id为 SP2514N的document
2、执行第一步后,再去搜索发现搜索结果中还有id为SP2514N的数据,难道我们第一步删除不成功吗?其实不是,因为第一步的命令中-Dcommit=false,所以第一步的删除操作没有提交到索引(index)中。
3、在没有打开新的searcher之前,第一步删除数据会一直存在于搜索结果中,所以我们可以强制打开一个新的searcher,执行命令:java -jar post.jar -

3.4 查询索引

solr通过http以get的方式进行搜索数据,如:http://localhost:8983/solr/collection1/select?q=solr&wt=xml
q:查询的关键词(此时查询的字段是solrconfig.xml中指定的默认查询字段`<str name=”df”>text</str>)`
fl:搜索结果返回的字段
sort:排序
wt:搜索结果返回格式
q=video&fl=name,id (return only name and id fields) 
q=video&fl=name,id,score (return relevancy score as well) 
q=video&fl=*,score (return all stored fields, as well as relevancy score) 
q=video&sort=price desc&fl=name,id,price (add sort specification: sort by price descending) 
q=video&wt=json (return response in JSON format) 

4 使用solrJ 调用solr 服务

4.1 solrJ介绍

solrj是solr的java客户端,用于访问solr索引库。
它提供了添加、删除、查询、优化等功能。
Jar 包位置
解压目录:
它是集成到solr压缩包里的,解压文件后,有个目录/dist/solrj-lib,里面就存放了solrj所用到的jar,你把这些jar都添加到你的classpath就ok。

4.2 使用solr j创建索引

String url = "http://localhost:8983/solr" ;
HttpSolrServer server = new HttpSolrServer(url); 
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for(int i=1;i<25;i++){
SolrInputDocument doc1=new SolrInputDocument();
doc1.addField("id", i);
doc1.addField("title", " sorlj 是一个基于lucene的 服务器");
docs.add(doc1);
}
server.add(docs);
server.commit();
4.3 solr 当中查询的使用
String url = "http://localhost:8983/solr";
        HttpSolrServer httpSolrServer=new HttpSolrServer(url);
        SolrQuery solrQuery=new SolrQuery();
        //开启高亮
        solrQuery.setHighlight(true);
        //设置高亮的字段....
        solrQuery.setParam("hl.fl", "title,content");
        //设置查询的字段
        solrQuery.setQuery("title:中");
//      设置高亮显示的格式...
        solrQuery.setHighlightSimplePre("<font color='red'>");
        solrQuery.setHighlightSimplePost("</font>");
        //返回结果
        QueryResponse response=httpSolrServer.query(solrQuery);
        SolrDocumentList documentList=response.getResults();
        //返回高亮过后的值
        //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名 
        Map<String, Map<String, List<String>>> maps=response.getHighlighting();
        System.out.println(documentList.getNumFound());
        for(SolrDocument solrDocument:documentList){
//          System.out.println(solrDocument.toString());
            //获取第一条记录
            Map<String, List<String>> map=maps.get(solrDocument.get("id"));
            System.out.println(maps.get(solrDocument.get("id"))+"================");
            //遍历字段对应的高亮值
            for(String s:map.get("title")){
                System.out.println(s);
            }
            //遍历字段对应的高亮值
            for(String ss:map.get("content")){

                System.out.println(ss);
            }
            //获取对应的文档的id
//          Map<String, List<String>> listStringMap=maps.get(id);
//          System.out.println(listStringMap);      }

5 schema.xml 介绍

schema.xml配置文件是用于定义index索引库的结构,有点类似于数据表表的定义。

 1、field–类似于数据表的字段
 2、fieldType字段类型
 3、<uniqueKey>id</uniqueKey>类似于数据表数据的id, solr索引库中最好定义一个用于标示document唯一性的字段,此字段主要用于删除document。
 4、<copyField/> <copyField source=”cat” dest=”text”/>
实际项目中为了方便查询,我们会把多个需要查询的字段合并到一个字段里,方便查询。举例:产品搜索,关键词不应该只匹配产品标题,还应该匹配产品关键词及产品简介等,那么在建立索引库时,可以把标题、产品关键词、简介放到一个叫text的字段中,搜索时直接搜text字段。

6 Solr 的索引库与数据库的数据进行同步

修改solrconfig.xml,添加下面这段代码:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
 </lst>
  </requestHandler>  

然后再solrconfig.xml文件统计的目录下新增上面声明的data-config.xml。内容如下:

因为需要连接数据库所以需要连接数据库的jar 包,以及操作索引库的jar 包,在collection 下面创建lib 目录将jar 包拷贝到lib 目录下
solr-dataimporthandler-4.7.0,solr-dataimporthandler-extras-4.7.0以及连接mysql 的jar 包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值