Solr是一个很是流行的,高性能的开源企业级搜索引擎平台,属于Apache Lucene项目。主要功能包括强大的全文检索、结果高亮、切面检索、动态聚类、数据库整合、富文本(例如Word,PDF)的处理,以及地理信息搜索。Solr是高度可扩展的,提供分布式检索和索引复制,并为世界上众多的大型网站提供搜索和导航功能。
Solr使用Java编写,可运行于servlet容器(如Tomcat)做为一个独立的全文搜索服务器。Solr以Lucene 为核心来建立索引和进行搜索,并提供相似REST的HTTP / XML和JSON API,这些API能够在任何编程语言中使用。经过Solr强大的扩展配置可适应几乎任何类型非Java编写应用程序,同时拥有丰富的插件来扩展高级功能。html
以上的介绍翻译自:http://lucene.apache.org/solr/。大概的翻译,若有错误欢迎指出。java
从Solr的官方网站上下载的Solr包里面有一个基于jetty的示例运行环境。下载Solr包,打开里面的example目录,点击里面的start.jar。在浏览器里面输入http://localhost:8983/solr,能够看到以下界面。web
以上是Solr管理控制台的主页,左边是导航。可使用http://localhost:8983/solr/#/collection1/query进行查询结果的查看。这里提供的是一个方便示例界面。如今应该是没有数据的,由于没有向里面添加索引。可使用solr提供的post.jar包进行简单的索引添加。这里再也不介绍此方法,后面使用Solrj进行操做。具体的能够查看Solr目录下面的/docs/tutorial.html文档。数据库
上面的运行是Solr默认绑定的一个jetty,若是须要在tomcat中运行solr,方法以下:apache
一、将Solr/dist/apache-solr-4.0.0.war此war包复制到tomcat的webapps目录下面,并重命名成solr。编程
二、点击tomcat/bin/startup.bat运行tomcat,这时tomcat会解压solr.war包到webapps目录下面。看到控制台里面会有报错提示,是找不到solr的实例运行环境。这时关闭tomcat。浏览器
三、删除webapps目录下面的solr.war包。将下载的solr目录下面的example下面的solr目录复制到tomcat的webapps/solr下面。下面的目录结构大概是这样的webapps/solr/solr/collection1相似这样的。缓存
四、打开webapps/solr/WEB-INF/web.xml文件,在里面添加以下内容。env-entry-value这个目录是指向上一个步骤中的目录。这里使用的是相对目录(相对于tomcat的bin目录),也可使用绝对路径,如d:/solr等。步骤3中的目录不必定要位于tomcat中,只要此步骤中将路径配置正确便可。tomcat
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>../webapps/solr/solr</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
五、再次运行tomcat,输入http://localhost:8080/solr便可访问在tomcat中运行的solr环境。性能优化
从上面的步骤中能够看出Solr提供了一个企业搜索引擎平台的核心,能够经过他的接口进行索引的建立、修改、删除。并提交关键字进行搜索。但若是要真正的投入使用,仍是有不和工做须要作,如:
一、对向Solr提交索引进行必定的封装以方便业务系统进行操做
二、对搜索进行封装,以方便结果的展示分析等等。
Solrj是使用java编写的一个操做Solr的工具,方便于进行索引的更新、搜索结果的获取等等。
在Solr的发布包里面有Solrj的相关jar包。Solrj须要的jar包为:
apache-solr-solrj-4.0.0.jar和他的依赖包solr/dist/solrj-lib
若是是使用maven,能够添加:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.0.0</version> </dependency>
使用Solrj是首先咱们实例化一个SolrServer,这里使用HttpSolrServer。咱们再建立一个SolrInputDocument以方便来添加要索引的数据。这里的Field是在\solr\solr\collection1\conf\schema.xml里面定义的,若是里面没有定义的字段在这里是不能添加的,除非是使用动态字段。示例代码以下:
String url = "http://localhost:8080/solr"; SolrServer server = new HttpSolrServer(url); SolrInputDocument doc1 = new SolrInputDocument(); doc1.addField("id", "1"); doc1.addField("title", "云南xxx科技"); doc1.addField("cat", "企业信息门户,元数据,数字沙盘,知识管理"); SolrInputDocument doc2 = new SolrInputDocument(); doc2.addField("id", "2"); doc2.addField("title", "胡启稳"); doc2.addField("cat", "知识管理,企业信息门户,云南,昆明"); SolrInputDocument doc3 = new SolrInputDocument(); doc3.addField("id", "3"); doc3.addField("title", "liferay"); doc3.addField("test_s", "这个内容能添加进去么?这是动态字段呀"); List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); docs.add(doc1); docs.add(doc2); docs.add(doc3); server.add(docs); server.commit();
到此就添加了三个document到solr的索引库里面。下面介绍如何进行搜索。
搜索的第一步和上面同样,先取得一个SolrServer。而后建立一个SolrQuery进行搜索,搜索取得的数据已经封装在QueryResponse里面,经过相关API获取结果数据。示例代码以下:
String url = "http://localhost:8080/solr"; SolrServer server = new HttpSolrServer(url); SolrQuery query = new SolrQuery("云南"); try { QueryResponse response = server.query(query); SolrDocumentList docs = response.getResults(); System.out.println("文档个数:" + docs.getNumFound()); System.out.println("查询时间:" + response.getQTime()); for (SolrDocument doc : docs) { System.out.println("id: " + doc.getFieldValue("id")); System.out.println("name: " + doc.getFieldValue("title")); System.out.println(); }