Solr的官方介绍
Solr is the popular, blazing fast opensource enterprise search platform from the Apache Lucene project. Its majorfeatures include powerful full-text search, hit highlighting, faceted search,dynamic clustering, database integration, and rich document (e.g., Word, PDF)handling. Solr is highly scalable, providing distributed search and indexreplication, and it powers the search and navigation features of many of theworld's largest internet sites.
Solr安装
1、上apache下载solr安装文件(http://lucene.apache.org/solr/),我做测试时下载的是最新版本的压缩包(apache-solr-1.4.1)。
2、解压缩,将apache-solr-1.4.1\example\webapps下的solr.war放置在tomcat容器的webapps目录中
3、设置Solr 的主位置,可以通过以下三种方式:
A、设置 java 系统属性 solr.solr.home (没错,就是 solr.solr.home)。
B、配置 java:comp/env/solr/home 的一个 JNDI 查找指向 solr 目录。
C、在包含 solr 目录的目录中启动 servlet 容器。(默认的 Solr 主目录是当前工作目录下的 solr。)。
我采用的方式是在tomcat的conf\Catalina\localhos目录下建立solr.xml文件,我将solr的home放在D盘,文件内同如下:
<?xml version="1.0" encoding="UTF-8"?><Context docBase="D:\apache-solr-1.4.1\example\webapps\solr.war" debug="0" crossContext="true" > <Environment name="solr/home" type="java.lang.String" value="D:\solr_home" override="true" /></Context>
这样配置不需要将solr.war文件放在tomcat容器的webapps目录中。Solr home中的内容为apache-solr-1.4.1\example\solr下的内容,其中主要的三个文件夹为:bin、conf、data,data下就是存放索引的地方。如果一切配置成功,启动tomcat,访问http://localhost:8088/solr/admin
(我的tomcat端口号为8088),即可访问到solr管理主界面。
Solr重要文件的简单说明(详细信息tosee solr wiki)
solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等。
schema.xml配置映射了各种数据类型的索引方案。分词器的配置、索引文档中包含的字段也在此配置。
Solr使用
Solr以web形式的发布,对外提供了添加、修改、删除索引和检索的web服务。并且提供多种格式的信息传输,如xml、json、cvs等,默认提供的是xml格式。
以下是按照solr的默认配置,对solr初步体验的过程
<!--[if !supportLists]-->1、 <!--[endif]-->设计索引模型。索引模型中包含四个不同数据类型的字段:Id(int)、time(Calendar)、enabled(boolean)、content(String)。其中id是文档的唯一标识。
<!--[if !supportLists]-->2、 <!--[endif]-->在schema.xml中映射索引模型的各个字段。
具体的内同如下:
<!—field 标签配置了字段的解析类型、是否需要索引、是否需要存储等,详细信息 to see solr wiki-- ><field name="id" type="integer" indexed="true" stored="true"/><field name="time" type="date" indexed="true" stored="true"/><field name="enabled" type="boolean" indexed="true" stored="true"/><field name="content" type="text" indexed="true" stored="true"/><!- 字段all是一个虚拟的字段,代表所有的字段,在此表示:id,time,enabled,content <field name="all" type="text" indexed="true" stored="true" multiValued="true"/><!—uniqueKey告诉solr id字段是文档的唯一标识 --><uniqueKey>id</uniqueKey><!—solrQueryParser 标签表示多条件检索时采用的策略。如:检索条件content:xxx time:xxx solr就会采取content:xxx OR time:xxx 这种形式--><solrQueryParser defaultOperator="OR"/><!—defaultSearchField标签表示如果没有明确检索那个字段,solr就会检索这个标签配置的字段 --><defaultSearchField>all</defaultSearchField><!—copyField标签表示将其他字段复制到目标字段,方面检索。如:将id、time、enabled、content 复制到all上面,当不指定明确的检索字段,solr就会检索all字段,其实就是检索id、time、enabled、content --><copyField source="id" dest="all"/><copyField source="time" dest="all"/><copyField source="enabled" dest="all"/><copyField source="content" dest="all"/>
<!--[if !supportLists]-->3、 <!--[endif]-->配置中文分词。
我采用的是IKAnalyzer中文分词,中文分词器的配置参考IKAnalyzer中文分词的使用手册。中文分词器需安装在solr web端
4、编写客户端程序访问solr web服务创建、修改、删除索引和搜索
Solr默认提供的web服务api如下:
创建、更新、提交、优化索引:http://localhost:8088/solr/updatepost
删除索引:http://localhost:8088/solr/updatepost
搜索:http://localhost:8088/solr/selectget
4.1 创建、更新、提交、优化索引(详细的配置信息 tosee Solr wiki)
创建、更新索引需要向solr服务提供如下的格式化信息
<add> <doc> <field name="id">1</field> <field name="time">2010-10-10T11:11:11.222S </field> <field name="enabled">true</field> <field name="content">solr development</field> </doc> [<doc> ... </doc>[<doc> ... </doc>]]</add>
创建或修改完索引,需要提交,这样solr才能够检索到
提交索引变化的格式化信息如下:
<commit/>
优化索引的格式化信息如下:
< optimize/>
索引的提交或优化也可以以url参数的形式体现。如
http://localhost:8088/solr/update?commit=true
4.2删除索引的格式化信息(详细的配置信息 tosee Solr wiki)
<delete> <id>1</id><id>2</id> <query>content:solr</query></delete>
4.3 搜索
Solr的查询语法(详细的配置信息 tosee Solr wiki)
参数 |
描述 |
示例 |
q |
Solr 中用来搜索的查询。有关该语法的完整描述,分号和已索引且未进行断词的字段(下面会进行解释)的名称来包含排序信息。默认的排序是 score desc,指按记分降序排序。 |
q=myField:Java AND otherField:developerWorks; date asc |
q.op |
表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或) |
q.op=AND |
start |
将初始偏移量指定到结果集中。可用于对结果进行分页。默认值为 0。 |
start=15 |
rows |
返回文档的最大数目。默认值为 10。 |
rows=25 |
fq |
提供一个可选的筛选器查询。查询结果被限制为仅搜索筛选器查询返回的结果。筛选过的查询由 Solr 进行缓存。它们对提高复杂查询的速度非常有用。 |
任何可以用 q 参数传递的有效查询,排序信息除外。 |
hl |
当 hl=true 时,在查询响应中醒目显示片段。默认为 false。 |
hl=true |
hl.fl |
高亮field |
hl.fl=id,content |
hl.simple.pre |
高亮前面的格式 |
hl.simple.pre=<a> |
hl.simple.post |
高亮后面的格式 |
hl.simple.post=</a> |
fl |
作为逗号分隔的列表指定文档结果中应返回的 Field 集。默认为 “*”,指所有的字段。“score” 指还应返回记分。 |
*,score |
sort
|
排序 |
sort =id asc |
实例
//利用httpclient访问solr服务、服务端返回标准的xml格式信息//需要较好的展示需要自己解析xml格式信息String keyword = req.getParameter("q");if(StringUtils.isNotBlank(keyword)){ String command = "fl=*,score&start=0&rows=10&hl=true&hl.fl=*&q="+URLEncoder.encode(keyword, "UTF-8"); responseResult = HttpClientUtils.sendGetCommand(command, "http://localhost:8088/solr/select"); responseResult = escape(responseResult);}
有了上述的基本了解,一个最基础的应用就可以跑起来了。具体代码请看附件源码
供参考的资料:
Solr 的wiki地址(内容非常详细,英语好的可直接阅读):
http://wiki.apache.org/solr/FrontPage
使用 Apache Solr实现更加灵巧的搜索第 1 部分: 基本特性和 Solr 模式
http://www.ibm.com/developerworks/cn/java/j-solr1/index.html?ca=drs-
使用 Apache Solr实现更加灵巧的搜索,第 2 部分: 用于企业的 Solr
http://www.ibm.com/developerworks/cn/java/j-solr2/index.html?ca=drs-