solr是基于Lucence搜索引擎的搜索服务器。lucene是一个搜索库,不是应用程序,solr对lucene进行了包装拓展,提供了比lucene更加丰富的查询语言,同时实现了可配置、可拓展并对查询语句进行优化,还提供了非常完善的功能界面。
Solr的特性包括:
1、高级的全文搜索功能
2、专为高通量的网络流量进行的优化
3、基于开放接口(XML和HTTP)的标准
4、综合的HTML管理界面
5、可伸缩性-能够有效地复制到另外一个Solr搜索服务器
6、使用XML配置达到灵活性和适配性
7、可扩展的插件体系
solr和lucene的区别:
lucene是一个搜索引擎工具jar包,不能独立运行。
而solr是一个全文检索服务器,可以对外提供检索和搜索功能。
通过这个图片我们可以看到,如果使用单独自己使用Lucene的话我们需要在web应用中添加对Lucene的一系列控制逻辑,然后还要单独有一个数据索引库。而我们使用solr的话,我们自己的web应用就和solr搜索服务器分开了,逻辑更加清晰,使用更加方便,而且solr还提供了solrcloud集群,便于分布式设计。
solr的安装以及中文分词器的配置可以参看这篇博客:http://blog.csdn.net/xuda27/article/details/53013005,我这边有一个配置好的solr服务器可以直接使用:http://download.csdn.net/download/liuyuanq123/10213438
安装过程中两个重要概念:
solrhome:是solr服务运行的主目录,类似于数据库的总表。
solrcore:是单独对外提供搜索服务和索引服务的目录,里面包含了solr实例运行所需要的配置文件和数据文件。类似于数据库的各个单表。
solrhome目录里面可以包含多个solrcore 目录,各个solrcore之间没有关系。
solr 客户端界面使用:
上面图中可以看到客户端界面中有三个选项是重要的,第一个分析,第二个是添加或者更新域,第三个是查询信息。
在查询窗口中,q表示查询条件,fq表示过滤条件,sort是排序,start和rows是显示的起始位置,和每页显示的个数,df表示默认搜索域。
Schema.xml的配置:
1:field域的定义
field域就是指我们能向索引库中添加的参数的名称。需要自己定义,如果没有定义,那么就添加不了索引。格式如下:
"id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
name指域的名称,type指域的类型(类型中会配置分词器),indexed是否索引,stored是否存储,required是否必须有,multivalued是否多值。
2:dynamicField的定义
动态域的name可以是不确定的,其余和普通域一致。
3:uniqueKey的定义
唯一键表示一个 配置文件中有且只有一个
4:copyField的定义
格式如下:
source="cat" dest="text"/>
表示把一个域的内容复制到另一个域里面,目标域一般都是multimultivalue
5:FieldType的定义
格式如下:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
analyzer>
fieldType>
name表示名称,class对应的solr的类型,analyzer指定分析器,type:query和index分别是查找和索引时用的分析器,tokenizer指定分词器,filter指定过滤器。一般我们会自己使用额外的中文分词器并定义自己需要用到的类型:
配置好了需要用到的类型后,便可以配置我们实际项目中所需要用到的业务域了。这里我们淘淘商城中配置了几个:
然后在我们的solr客户端页面中可以看到我们添加的域都存在了:
首先将我们solr所需要的jar包添加的pom文件中,然后编写添加索引的测试代码,代码如下:
@Test
public void testSolrJ() throws Exception{
//创建solrserver对象
SolrServer server = new HttpSolrServer("http://192.168.156.22:8080/solr/collection1");
//创建文本对象
SolrInputDocument sInputDocument = new SolrInputDocument();
//向文本对象中添加域
sInputDocument.addField("id", "test0001");
sInputDocument.addField("title", "测试标题");
sInputDocument.addField("item_sell_point", "测试卖点");
sInputDocument.addField("item_price", 500);
sInputDocument.addField("item_category_name","测试" );
sInputDocument.addField("item_desc", "测试描述");
//将文本对象添加到索引库
server.add(sInputDocument);
//提交
server.commit();
}
添加过后再在我们的界面中进行查找:
可以看到添加成功。类似的我们可以使用solrj进行查询:
@Test
public void testQueryDoc() throws Exception{
//创建solrserver对象
SolrServer server = new HttpSolrServer("http://192.168.156.22:8080/solr/collection1");
//创建查询对象
SolrQuery solrQuery = new SolrQuery();
//设置查询条件等
solrQuery.setQuery("手机");
//设置分页条件
solrQuery.setStart(0);
solrQuery.setRows(10);
//设置默认搜索域
solrQuery.set("df", "item_keywords");
//执行查询
QueryResponse response = server.query(solrQuery);
//去查询结果
SolrDocumentList solrDocumentList = response.getResults();
//去查询结果的记录数
System.out.println("查询的总结果数:"+solrDocumentList.getNumFound());
//显示结果
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.getFieldValue("id"));
System.out.println(solrDocument.get("item_title"));
System.out.println(solrDocument.get("item_sell_point"));
System.out.println(solrDocument.get("item_price"));
System.out.println(solrDocument.get("item_image"));
System.out.println(solrDocument.get("item_category_name"));
System.out.println("===============================================");
}
}
可以看到里面设置的那几个条件都是和solr客户端界面相对应的。