(一)首先了解一下Solr
1 solr是一个基于Lucene的搜索引擎,可以实现全文搜索。同时对其进行了扩展,提供了比Lucene更为丰富的查询语句,同时实现了可配置,可扩展并对查询性能进行了优化,提供一个功能完善的管理页面,是一款非常优秀的全文搜索引擎。
2 solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,可以通过http请求进行操作,提交一定格式的XML文件,生成索引,并得到XML格式的返回结果。
3 solr可以很方便的实现一个站内搜索的功能。
(二)了解一下全文搜索的工具
1 Lucene
java家族中最出名的一个开源搜索引擎,在Java世界中已经是一个标准的全文搜索程序,它提供一个完整的查询引擎和索引引擎。
官方主页:http://lucene.apache.org/
2 solr
solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,是基于Lucene的全文检索服务器。
官方主页:http://lucene.apache.org/solr/
3 Elasticsearch
Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源,分布式的搜索引擎,设计用于云计算中,能够实现实时搜索。
官方主页:http://www.elasticsearch.org/
(三)了解一下Solr的特点:
1 通过HTTP协议处理搜索和查询速度。
2 增加了缓存功能,让响应速度更快。
3 提供了一个基于web的管理界面。
4 查询结果分类(facet)
5 支持分布式,支持大规模的部署(solrcloud Solr4.0版本开始)
简单看一下Solr的架构,solr的底层使用的Lucene,在Lucene上面是SolrCore,可以使用XML文档格式进行配置信息交互,通过HTTP协议来访问solr建立的搜引。
(四)下面讲解Solr安装:
进入/home/alan文件夹中
cd /home/alan
获取 solr-4.8.1
wgethttps://archive.apache.org/dist/lucene/solr/4.8.1/solr-4.8.1.tgz
解压solr-4.8.1
tar -zxvf solr-4.8.1.tgz
重命名
mv solr-4.8.1solr
将nutch/runtime/local中的schema文件放到solr/collection1/conf/下面
cp /home/alan/nutch/runtime/local/conf/schema.xml/home/alan/solr/example/solr/collection1/conf/
schema.xml
这个配置文件的根本目的是为了通过配置告诉Solr如何建立索引,这个文件非常的重要。
example目录下,启动solr
输入: java–jar start.jar
打开浏览器,在页面上输入:
http://192.168.14.151:8983/solr/#/collection1
访问solr的管理页面
1. Dashboard 仪表盘,显示Solr的基本信息,包含solr版本,包含系统内存和jvm内存的使用情况,jvm参数等
2.Logging solr的运行日志,用来查看solr运行是否有警告或者异常,以便及时处理
3. CoreAdmin 索引库管理,这个界面很重要,这使多核的配置,索引库的优化等,变得非常简单;
主要功能包括:Add Core(添加核心,即索引库),Unload(卸载核心),Rename(重命名核心),Optimize(优化索引库)。
4. CoreSelector 核心选择器,选择要操作的索引库
1. Overview(概览):查看索引的情况,例如:看看Num docs数量是否增加。包含基本统计如当前文档数;和实例信息如当前核心的配置目录;
2. Analysis(分析):检验分词效果,用来诊断潜在的文本分析的查询/索引问题。注意FieldType需要选定为与被分析内容类型一致。
3. Query(查询):这是一个查询界面,用的比较多,用来查询索引的文档,包含是否存在,排序是否正确等。稍后会介绍相关的查询参数。
4. Schema(当前索引库定义),显示当前的schema的配置文件,即schema.xml的内容,例如:可以看到schema.xml中的配置的字段等信息。
5. Documents (索引文档)索引的相关操作,增加,修改,删除等,例如我们要增加一个索引
a. 先要在solr的D:\solr_home\mycore1\conf 的 schema.xml配置文件下,增加相关的字段field,例如:
b. 在如下页面,选择/update,文档格式选择json,然后submit 提交。这样索引就增加上了。修改与增加一样,都是/update ,删除为/delete。
感谢:http://blog.sina.com.cn/s/blog_662728650102wp79.html
进入nutch,向solr中抓取数据:
bin/crawl urls/seed.txt alanhttp://192.168.14.151:8983/solr/ 2
schema.xml这个配置文件的根本目的是为了通过配置告诉Solr如何建立索引。
solr的数据结构如下:
- document:一个文档、一条记录
- field:域、属性
solr通过搜索某个或某些field,返回若干个符合条件的document,或者按搜索的score排序返回。
如果跟数据库对比,document相当于数据库的表,field相当于表中的字段。而schema.xml就是为了定义一个表的结构(定义各个field的名字、类型、约束、等等)。
schema.xml的基本结构如下:
<schema>
<types>
<fields>
<uniqueKey>
<copyField>
</schema>
常用的配置说明:
field:定义一个document中的各个fields
name:必填。该field的名字。前后都有下划线的name是系统保留的名字,比如“_version_”
type:必填。类型,对应于fieldType的name
default:该field的缺省值
indexed:true/false,是否为该field建立索引,以让用户可以搜索它、统计它(facet)
stored:true/false,定义这个field是否可以返回给查询者
multiValued:true/false,是否可以容纳多个值(比如多个copyField的dest指向它)。如果是true,则该field不能被排序、不能作为uniqueKey
required:true/false,告诉solr这个field是否接受空值,缺省为false
docValues:true/false,建立document-to-value索引,以提高某些特殊搜索的效率(排序、统计、高亮)
copyField:把一个field的内容拷贝到另外一个field中。一般用来把几个不同的field copy到同一个field中,以方便只对一个field进行搜索
source:被拷贝的field,支持用通配符指定多个field,比如:*_name
dest:拷贝到的目的field
maxChars:最大字符数
uniqueKey:指定一个field为唯一索引
fieldType:定义field的类型,包括下面一些属性
name:必填,被field配置使用
class:必填,filedType的实现类。solr.TextField是路径缩写,"等价于"org.apache.solr.schema.TextField"
multiValued:是否允许多值
positionIncrementGap:指定mutiValued的距离
ananlyzer:如果class是solr.TextField,这个配置是必填的。告诉solr如何处理某些单词、如何分词,比如要不要去掉“a”,要不要全部变成小写……
type:index或query
tokenizer:分词器,比如:StandardTokenizerFactory
filter:过滤器,比如:LowerCaseFilterFactory
dynamicField:用通配符定义一个field来存在没有被field定义的漏网之鱼
name:使用通配符,比如“*_i”,来处理类似“cost_i”之类的field
感谢:http://blog.csdn.net/clementad/article/details/47666043
(五)配置中文分词器:
solr本身对中文分词的处理不是太好,所以中文应用很多时候都需要额外加一个中文分词器对中文进行分词处理,ik-analyzer就是其中一个不错的中文分词器。
一、/home/alan/solr/example/solr/collection1/conf 下放置:
1 stopword.dic
2 ext.dic
3 IKAnalyzer.cfg.xml
二、/home/alan/solr/example/solr-webapp/webapp/WEB-INF/lib下放置
IKAnalyzer2012FF_u1.jar
修改solr中的schema.xml文件
vi/home/alan/solr/example/solr/collection1/conf/schema.xml
[java] view plain copy
- <field name="name"type="text_ik" stored="true" indexed="true" multiValued="true"/>
- <fieldType name="text_ik"class="solr.TextField">
- <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
- </fieldType>
IKAnalyzer2012FF_u1 下载地址: http://download.csdn.net/download/shuaigexiaobo/10108763
(七)SolrJ 的配置
1 建立java项目,工程名称SolrJ
2 导入jar 包
找到sorl根目录下的disc文件夹,将disc/solr-lib文件夹下面的所有jar包导入项目中。
将disc下面的除了solr-dataimporthandler ,solr-dataimporthandler –extras两个jar包外的所有jar包导入项目中。
3 构建路径
4 在cn.alan.dao包下面建立solrJ的dao
[java] view plain copy
- public class Person{
- @Field(value="id")
- private String id;
- @Field(value="title")
- private String title;
- @Field(value="content")
- private String content;
- }
[java] view plain copy
- package cn.alan.dao
- public class SolrJ{
- //第一种:通过document方式添加
- public void addIndex(){
- //跟solr建立连接
- String urlString = "http://localhost:8983/solr";
- SolrServer solr = new HttpSolrServer(urlString);
- //创建document
- SolrInputDucument document = new SolrInputDucument();
- document.addField("id","1");
- document.addField("title","alan");
- document.addField("content","alan is teacher name");
- //建立索引
- solr.add(document);
- solr.commit();
- }
- //第二种:通过bean的方式添加
- public void addIndexBean(){
- //跟solr建立连接
- String urlString = "http://localhost:8983/solr";
- SolrServer solr = new HttpSolrServer(urlString);
- //创建一个bean对象
- Person person = new Person();
- person.setId("99");
- person.setTitle("nick");
- person.setContent("高富帅");
- //建立索引
- solr.addBean(person);
- solr.commit();
- }
- //删除索引
- public void delete(){
- //跟solr建立连接
- String urlString = "http://localhost:8983/solr";
- SolrServer solr = new HttpSolrServer(urlString);
- //通过ID的方式删除索引
- solr.deleteByID("99");
- solr.commit();
- }
- //更新数据,更新的话如果是ID相同,它会直接更新。
- //查询
- public void find(){
- //跟solr建立连接
- String urlString = "http://localhost:8983/solr";
- SolrServer solr = new HttpSolrServer(urlString);
- //以后参数都是通过这个对象进行构造
- SolrParams params = new SolrQuery();
- params.setQuery("title","alan");
- //高亮
- //开启高亮
- params.setHighlight(true);
- //高亮显示的格式
- params.setHighlightSimplePre("<font color='red'>");
- params.setHighlightSimplePost("</font>");
- //需要将哪几个字段进行高亮
- params.setParam("hl.fl","content");
- //分页
- params.setStart(0);
- params.setRows(10);
- QueryResponse response = solr.query(params);
- //返回高亮之后的结果
- Map<String,Map<String,List<String>>> map = response.getHightlighting();
- for(SolrDucument solrDocument:documentList){
- String id = (String)solrDocument.get("id");
- Map<String,List<String>> fieldMap = map.get(id);
- List<String> list = fieldMap.get("content");
- for(int i=0;i<list.size();i++){
- System.out.println(list.get(i));
- }
- }
- //返回所有结果
- SolrDucumenList documentList=response.getResults();
- for(SolrDucument solrDocument:documentList){
- String id = (String)solrDocument.get("id");
- String title = (String)solrDocument.get("title");
- String content = (String)solrDocument.get("content");
- System.out.println(id);
- System.out.println(title);
- System.out.println(content);
- }
- }
- }