Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务器通讯使用标准的HTTP 和XML,因此若是使用Solr 了解Java 技术会有用却不是必须的要求。 html
Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word ,PDF 等)的处理。并且Solr 具备高度的可扩展,支持分布搜索和索引的复制。 java
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。 web
目前已经有不少应用程序的搜索功能是基于 Lucene ,好比 Eclipse 帮助系统的搜索功能。Lucene 可以为文本类型的数据创建索引,因此你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。 算法
Solr 与Lucene 并非竞争对立关系,偏偏相反Solr 依存于Lucene ,由于Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。须要注意的是Solr 并非简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene 。 shell
Solr 必须运行在Java1.5 或更高版本的Java 虚拟机中,运行标准Solr 服务只须要安装JRE 便可,但若是须要扩展功能或编译源码则须要下载JDK 来完成。能够经过下面的地址下载所需JDK 或JRE : 数据库
Solr 能够运行在任何Java 中间件中,下面将以开源Apache Tomcat 为例讲解Solr 的安装、配置与基本使用。本文使用Tomcat5.5 解压版进行演示,可在下面地址下载最新版本http://tomcat.apache.org/download-55.cgi apache
本文发布时Solr1.4 为最新的版本,下文介绍内容均针对该版本,如与Solr 最新版本有出入请以官方网站内容为准。Solr官方网站下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/ api
Solr 程序包 的目录结构Solr 的源码没有放在同一个目录下,src/java 存放大多数文件,src/common 是服务器端与客户端公用的代码,src/test 放置solr 的测试程序,serlvet 的代码放在src/webapp/src 中。 tomcat
Solr 主目录结构一个运行的Solr 服务其主目录包含了Solr 的配置文件和数据(Lucene 的索引文件) 安全
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/
将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/ ,显示以下界面表示启动成功。
SolrJ 是Solr 服务器的一个Java 接口,使用该接口不再同为虑客户端与服务器端交互时格式解析和转换的问题烦恼了,取而代之的是用你熟悉的对象来进行相关的操做,并且随着Solr 的不断升级SolrJ 也会一样提供这些新加入的功能。
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();
分词产品 目前Lucene 的中文分词主要有:
分词效率
下面是各个分词产品官方提供的数据:
自定义词库
以上产品中只有 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>