Solr Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)


Apache Solr 介绍

Solr 是什么?

Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务器通讯使用标准的HTTP 和XML,因此若是使用Solr 了解Java 技术会有用却不是必须的要求。 html

Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word ,PDF 等)的处理。并且Solr 具备高度的可扩展,支持分布搜索和索引的复制。 java

Lucene 是什么?

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。 web

目前已经有不少应用程序的搜索功能是基于 Lucene ,好比 Eclipse 帮助系统的搜索功能。Lucene 可以为文本类型的数据创建索引,因此你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。 算法

Solr VS Lucene

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

安装搭建Solr

安装 Java 虚拟机

Solr 必须运行在Java1.5 或更高版本的Java 虚拟机中,运行标准Solr 服务只须要安装JRE 便可,但若是须要扩展功能或编译源码则须要下载JDK 来完成。能够经过下面的地址下载所需JDK 或JRE : 数据库

  • OpenJDK ( http://java.sun.com/j2se/downloads.html )
  • Sun (http://java.sun.com/j2se/downloads.html )
  • IBM (http://www.ibm.com/developerworks/java/jdk/ )
  • Oracle (http://www.oracle.com/technology/products/jrockit/index.html )安装 步骤请参考相应的帮助文档。
安装中间件

Solr 能够运行在任何Java 中间件中,下面将以开源Apache Tomcat 为例讲解Solr 的安装、配置与基本使用。本文使用Tomcat5.5 解压版进行演示,可在下面地址下载最新版本http://tomcat.apache.org/download-55.cgi apache

安装Apache Solr
下载最新的Solr

本文发布时Solr1.4 为最新的版本,下文介绍内容均针对该版本,如与Solr 最新版本有出入请以官方网站内容为准。Solr官方网站下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/ api

Solr 程序包 的目录结构
  • build :在solr 构建过程当中放置已编译文件的目录。
  • client :包含了一些特定语言调用Solr 的API 客户端程序,目前只有Ruby 可供选择,Java 客户端叫SolrJ 在src/solrj 中能够找到。
  • dist :存放Solr 构建完成的JAR 文件、WAR 文件和Solr 依赖的JAR 文件。
  • example :是一个安装好的Jetty 中间件,其中包括一些样本数据和Solr 的配置信息。
  • example/etc :Jetty 的配置文件。
  • example/multicore :当安装Slor multicore 时,用来放置多个Solr 主目录。
  • example/solr :默认安装时一个Solr 的主目录。
  • example/webapps :Solr 的WAR 文件部署在这里。
  • src :Solr 相关源码。
  • src/java :Slor 的Java 源码。
  • src/scripts :一些在大型产品发布时一些有用的Unix bash shell 脚本。
  • src/solrj :Solr 的Java 客户端。
  • src/test :Solr 的测试源码和测试文件。
  • src/webapp :Solr web 管理界面。管理界面的Jsp 文件都放在web/admin/ 下面,能够根据你的须要修改这些文件。

Solr 的源码没有放在同一个目录下,src/java 存放大多数文件,src/common 是服务器端与客户端公用的代码,src/test 放置solr 的测试程序,serlvet 的代码放在src/webapp/src 中。 tomcat

Solr 主目录结构

一个运行的Solr 服务其主目录包含了Solr 的配置文件和数据(Lucene 的索引文件) 安全

Solr 的主目录展开后为以下结构:

  • bin :建议将集群复制脚本放在这个目录下。
  • conf :放置配置文件。
  • conf/schema.xml :创建索引的schema 包含了字段类型定义和其相关的分析器。
  • conf/solrconfig.xml :这个是Solr 主要的配置文件。
  • conf/xslt :包含了不少xslt 文件,这些文件能将Solr 的XML 的查询结果转换为特定的格式,好比:Atom/RSS。
  • data :放置Lucene 产生的索引数据。
  • lib :放置可选的JAR 文件好比对Slor 扩展的插件,这些JAR 文件将会在Solr 启动时加载。
如何 设置 主目录

经过Java system property ,属性的名称是:solr.solr.home 。

经过JNDI 将主目录的路径绑定到java:comp/env/solr/home 。

经过修改web.xml 位置在:src/web-app/web/WEB-INF ,

<env-entry>    <env-entry-name>solr/home</env-entry-name>    <env-entry-value>solr/</env-entry-value>    <env-entry-type>java.lang.String</env-entry-type></env-entry>

若是Solr 主目录没有指定则默认设置为solr/

发布运行Solr

将apache-solr-1.4.0/dist/apache-solr-1.4.0.war 从安装包中解压到<tomcat home>/webapps 下。WAR 是一个完整的web 应用程序,包括了Solr 的Jar 文件和全部运行Solr 所依赖的Jar 文件,Jsp 和不少的配置文件与资源文件,这里须要注意的是:WAR 文件中不包括Solr 主目录,所以在启动tomcat 以前咱们要先指定Solr 的主目录。

将安装程序中的apache-solr-1.4.0/example/solr 文件夹解压到<tomcat homt>/ 下,而后在<tomcat home>/bin/catalina.bat 第一行添加以下内容:

set JAVA_OPTS=%JAVA_OPTS% -Dsolr.solr.home=<tomcat home>/solr注:Windows 之外操做系统需修改 catalina.sh 文件。

启动tomcat ,apache-solr-1.4.0.war 自动发布为web 应用。

点击连接访问Solr 控制台界面,http://localhost:8080/apache-solr-1.4.0/ ,显示以下界面表示启动成功。

resource

resource(1)

使用Java 接口访问Solr 服务

SolrJ 是Solr 服务器的一个Java 接口,使用该接口不再同为虑客户端与服务器端交互时格式解析和转换的问题烦恼了,取而代之的是用你熟悉的对象来进行相关的操做,并且随着Solr 的不断升级SolrJ 也会一样提供这些新加入的功能。

SolrJ (Solr1.4 )依赖的Jar 包
  • commons-codec-1.3.jar
  • commons-fileupload-1.2.1.jar
  • commons-httpclient-3.1.jar
  • commons-logging-1.0.4.jar
  • commons-io-1.4.jar
  • geronimo-stax-api_1.0_spec-1.0.1.jar
  • solr-solrj-1.4.0.jar
  • wstx-asl-3.2.7.jar
  • stax-api-1.0.1.jar
  • slf4j-api-1.5.5.jar
  • slf4j-simple-1.5.5.jar
建立 SolrServer

SolrJ 中有2 种SolrServer 对象,CommonsHttpSolrServer 与EmbeddedSolrServer ,他们都是线程安全的并建议使用单例模式来使用他们,由于动态建立会形成链接泄露。

Create CommonsHttpSolrServer

String url = "http://localhost:8983/solr";SolrServer server = new CommonsHttpSolrServer( url );

Create EmbeddedSolrServer

// solr.solr.home 属性也能够经过 JVM 参数设置System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");CoreContainer.Initializer initializer = new CoreContainer.Initializer();CoreContainer coreContainer = initializer.initialize();EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");
添加
public SolrServer getSolrServer(){    // 对象实例能够重复使用    return new CommonsHttpSolrServer();}SolrServer server = getSolrServer();// 清空以前创建的索引数据server.deleteByQuery( "*:*" );// 建立一个文档SolrInputDocument doc1 = new SolrInputDocument();doc1.addField( "id", "id1", 1.0f );doc1.addField( "name", "doc1", 1.0f );doc1.addField( "price", 10 );// 建立另一个文档SolrInputDocument doc2 = new SolrInputDocument();doc2.addField( "id", "id2", 1.0f );doc2.addField( "name", "doc2", 1.0f );doc2.addField( "price", 20 );// 建立文档集合Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();docs.add( doc1 );docs.add( doc2 );// 将文档添加到 Solr 中server.add( docs );// 提交server.commit();
查询
// 获得一个 SolrServer 实例(经过上面介绍的方法建立)SolrServer server = getSolrServer();// 构造一个查询对象SolrQuery query = new SolrQuery();query.setQuery( "*:*" );query.addSortField( "price", SolrQuery.ORDER.asc );// 查询结果SolrDocumentList docs = rsp.getResults();

solr中文分词

分词产品 目前Lucene 的中文分词主要有:

  • paoding :Lucene 中文分词“庖丁解牛” Paoding Analysis 。
  • imdict :imdict 智能词典所采用的智能中文分词程序。
  • mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器。
  • ik :采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式。

分词效率

下面是各个分词产品官方提供的数据:

  • paoding :在PIII 1G 内存我的机器上,1 秒 可准确分词 100 万 汉字。
  • imdict :483.64 ( 字节/ 秒) ,259517( 汉字/ 秒) 。
  • mmseg4j : complex 1200kb/s 左右, simple 1900kb/s 左右。
  • ik :具备 50 万字 / 秒的高速处理能力。

自定义词库

  • paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载
  • imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop words
  • mmseg4j :自带 sogou 词库,支持名为 wordsxxx.dic , utf8 文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path
  • ik : 支持 api 级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码, \r\n 分割。不支持自动检测。
  • ik 与 solr 集成

以上产品中只有 ik 提供了 Solr ( 1.3 , 1.4 )的分词接口程序,只需修改配置文件便可实现中文分词,配置方法以下;

使用 IKAnalyzer 的配置

<schema name="example" version="1.1">……<fieldType name="text" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>……</schema>

使用 IKTokenizerFactory 的配置

<fieldType name="text" class="solr.TextField" ><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>……</analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>……</analyzer></fieldType>
相关文章
相关标签/搜索