Solr4.0搭建应用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Solr4.0搭建应用

Solr4.0搭建应用

 2013/9/4 15:15:04  wbj0110  程序员俱乐部  我要评论(0)
  • 摘要:今天看到Solr4.0于是心血来潮重新整理一下,因为之前只整理过3.6的,而且还没有发到博客上。下载地址http://lucene.apache.org/solr/点击下面的4.0转向到http://www.apache.org/dyn/closer.cgi/lucene/solr/4.0.0我推荐大家用这个http://labs.mop.com/apache-mirror/lucene/solr/4.0.0你懂得,这是猫扑哦。好吧,下载完毕后,我们解压,看到下图之后进入example文件夹
  • 标签:应用

今天看到Solr4.0于是心血来潮重新整理一下,因为之前只整理过3.6的,而且还没有发到博客上。?
下载地址http://lucene.apache.org/solr/?
?
点击下面的4.0?
转向到http://www.apache.org/dyn/closer.cgi/lucene/solr/4.0.0?
?
我推荐大家用这个?
http://labs.mop.com/apache-mirror/lucene/solr/4.0.0?
你懂得,这是猫扑哦。?

好吧,下载完毕后,我们解压,看到下图?
class="magplus" height="75" src="/Upload/Images/2013090415/3F768BA31EA96592.jpg" style="cursor: , pointer; line-height: 25.200000762939453px;">
之后进入example文件夹,打开README.txt?
部分内容如下?
This directory contains an instance of the Jetty Servlet container setup to?
run Solr using an example configuration.?

To run this example:?

? java -jar start.jar?

in this example directory, and when Solr is started connect to?

? http://localhost:8983/solr/?

To add documents to the index, use the post.jar (or post.sh script) in?
the example/exampledocs subdirectory (while Solr is running), for example:?

???? cd exampledocs?
???? java -jar post.jar *.xml?
Or:? sh post.sh *.xml?

按照以上步骤,可以启动Solr了.?


之后访问http://localhost:8983/solr/select?q=*:*?

?

到此说明一切都很顺利,通过post.jar也将一个文档存到了Solr服务器上。?

?

Tomcat部署Solr

?

在解压出来的文件夹当中找到example\webapps\solr.war
这个便是Solr应用,我们将其拷贝到tomcat\webapp\目录下,然后启动
目的是展包,当然也可以用winrar解压出来,不过我们这样做的原因是为了看报错信息。



?启动Tomcat

报错信息如下


?
之前3.6版本的时候,我使用JNDI在tomcat\conf\localhost\下创建solr.xml
不过这次我们就跟随问题源头,看提示信息来完成Solr部署吧
其实最主要的就是Solr的Home环境设置,这里我不多说,我们看最关键的一行

?
这里在我们的Tomcat目录中的bin目录里去查看solr\solr.xml,却没有找到,那么很简单。我们来创建一下,这里就直接使用多核吧。


?回到Solr4.0解压后的文件夹的example目录下,我们看到multicore


?

?


?
很好,我们看到了solr.xml,另外还有其他文件夹,这里不分拆单独拷贝solr.xml了,此时我们应当把所有文件都复制
然后再tomcat的bin目录下创建solr文件夹将这些粘贴进去即可。

重新启动后无报错信息,我们访问http://localhost:8080/solr/ 便看到了熟悉的界面了。

?

前面两章已经可以运行起Solr4.0了。接下来要跟Solr通讯进行数据交互,关于Solr支持的DIH数据导入,我不写了。

回到solr4.0解压出的文件夹中找到dist


?新建一个Java工程,这里我就新建了一个Web工程,将solrj和solrj-lib文件夹中的jar文件放到项目依赖中去。

?

?

Java代码??收藏代码
  1. package?org.solrj.root;??
  2. ??
  3. import?java.io.IOException;??
  4. ??
  5. import?org.apache.solr.client.solrj.SolrServer;??
  6. import?org.apache.solr.client.solrj.SolrServerException;??
  7. import?org.apache.solr.client.solrj.impl.HttpSolrServer;??
  8. ??
  9. public?class?Root?{??
  10. ????public?static?void?main(String[]?args)?{??
  11. ????????SolrServer?server=new?HttpSolrServer("http://localhost:8080/solr/core0/");??
  12. ????????try?{??
  13. ????????????//test??
  14. ????????????server.deleteByQuery(?"*:*"?);??
  15. ????????}?catch?(SolrServerException?e)?{??
  16. ????????????e.printStackTrace();??
  17. ????????}?catch?(IOException?e)?{??
  18. ????????????e.printStackTrace();??
  19. ????????}??
  20. ????}??
  21. }??

?执行后,没有异常,说明没有问题

Java代码??收藏代码
  1. public?static?void?addIndexDoc(SolrServer?server)?throws?SolrServerException,?IOException?{??
  2. ????????//注意这里添加的字段名必须是?服务器上schema定义了的,不了解的请了解schema.xml去。??
  3. ??????????
  4. ????????SolrInputDocument?doc1?=?new?SolrInputDocument();??
  5. ????????doc1.addField("id",?"dog1001",?1.0f);??
  6. ????????doc1.addField("name",?"jack",?1.0f);??
  7. ????????doc1.addField("price",?10);??
  8. ??
  9. ????????SolrInputDocument?doc2?=?new?SolrInputDocument();??
  10. ????????doc2.addField("id",?"dog1002",?1.0f);??
  11. ????????doc2.addField("name",?"jim",?1.0f);??
  12. ????????doc2.addField("price",?15);??
  13. ??????????
  14. ????????Collection<SolrInputDocument>?docs?=?new?ArrayList<SolrInputDocument>();??
  15. ????????docs.add(?doc1?);??
  16. ????????docs.add(?doc2?);??
  17. ??????????
  18. ????????server.add(docs);??
  19. ????????server.commit();??
  20. ??????????
  21. ????}??

?
执行添加方法

添加成功后,查询如下图


?

这说明我们添加成功

既然可以完成添加索引文档了,那么肯定要考虑到中文分词

? 下载mmseg4j分词器:http://code.google.com/p/mmseg4j/downloads/list?

将压缩包解压,mmseg4j-all-1.9.0-with-dic.jar该文件放置于solr应用的Web-inf\lib目录中去

?

Xml代码??收藏代码
  1. <fieldType?name="textComplex"?class="solr.TextField"?>??
  2. ??????<analyzer>??
  3. ????????<tokenizer?class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"?mode="complex"?/>??
  4. ??????</analyzer>??
  5. ????</fieldType>??
  6. <fieldType?name="textMaxWord"?class="solr.TextField"?>??
  7. ??????<analyzer>??
  8. ????????<tokenizer?class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"?mode="max-word"?/>??
  9. ??????</analyzer>??
  10. ????</fieldType>??
  11. <fieldType?name="textSimple"?class="solr.TextField"?>??
  12. ??????<analyzer>??
  13. ????????<tokenizer?class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"?mode="simple"?/>??
  14. ??????</analyzer>??
  15. ????</fieldType>??

?
将以上片段添加到schema.xml文件中去,这样我们添加了三个字段类型,这三种类型交给了分词器来处理。
也就是说我们在添加了文档包含这些字段的时候,就会进行分词索引。

我们变更comments字段为分词类型,如下图

?

Java代码??收藏代码
  1. SolrInputDocument?doc1?=?new?SolrInputDocument();??
  2. ????doc1.addField("id",?"dog1003",?1.0f);??
  3. ????doc1.addField("name",?"lucy",?1.0f);??
  4. ????doc1.addField("price",?10);??
  5. ????doc1.addField("comments",?"出生在上海,原名杨颖,香港新一代潮流教主,拥有四分之一baby童年照(10张)德国血统。爷爷是德国人。");??
  6. ??
  7. ????SolrInputDocument?doc2?=?new?SolrInputDocument();??
  8. ????doc2.addField("id",?"dog1004",?1.0f);??
  9. ????doc2.addField("name",?"sim",?1.0f);??
  10. ????doc2.addField("price",?15);??
  11. ????doc2.addField("comments",?"自从全家移居上海,父母一直为糊口奔驰,在小学一年级时就要自己放学,“当时太小,不知危险,反而最怕过马路。");??

?我们修改之前写的addIndexDoc函数,重新添加。并且执行。

?


如果要进行查询,请记得将Tomcat server.xml 添加URIEncoding="UTF-8"

下面我们尝试一下查询关键字
http://localhost:8080/solr/core0/select?q=comments:*上海
请使用Chrome浏览器


?很好,我们看到了查询结果


那么我们如何看分词情况呢?

之前使用的都是SolrInputDocument来完成像服务器提交数据,但是Solr给我们提供了更便捷的方法
支持直接使用Java PoJo类来完成提交数据
那么我们先写一个Pojo类,如下
package org.solrj.root;

Java代码??收藏代码
  1. package?org.solrj.root;??
  2. ??
  3. import?org.apache.solr.client.solrj.beans.Field;??
  4. ??
  5. public?class?Dog?{??
  6. ????@Field??
  7. ????private?String?id;??
  8. ????@Field??
  9. ????private?String?name;??
  10. ????@Field??
  11. ????private?Float?price;??
  12. ????@Field??
  13. ????private?String?comments;??
  14. ????public?String?getId()?{??
  15. ????????return?id;??
  16. ????}??
  17. ????public?void?setId(String?id)?{??
  18. ????????this.id?=?id;??
  19. ????}??
  20. ????public?String?getName()?{??
  21. ????????return?name;??
  22. ????}??
  23. ????public?void?setName(String?name)?{??
  24. ????????this.name?=?name;??
  25. ????}??
  26. ????public?Float?getPrice()?{??
  27. ????????return?price;??
  28. ????}??
  29. ????public?void?setPrice(Float?price)?{??
  30. ????????this.price?=?price;??
  31. ????}??
  32. ????public?String?getComments()?{??
  33. ????????return?comments;??
  34. ????}??
  35. ????public?void?setComments(String?comments)?{??
  36. ????????this.comments?=?comments;??
  37. ????}??
  38. ??????
  39. }??

?
我们在相应的保持一致的字段上添加了注解

?

? 接下来我们写一个向服务器添加的函数。

?

Java代码??收藏代码
  1. public?static?void?addIndexDocWithPojo(SolrServer?server)?throws?SolrServerException,?IOException{??
  2. ????????Dog?dog1=new?Dog();??
  3. ????????dog1.setComments("大家好,我是中国狗,我在北京");??
  4. ????????dog1.setId("dog1005");??
  5. ????????dog1.setName("天语");??
  6. ????????dog1.setPrice(520.6f);??
  7. ??????????
  8. ????????Dog?dog2=new?Dog();??
  9. ????????dog2.setComments("大家好,我是日本狗,我在东京");??
  10. ????????dog2.setId("dog1006");??
  11. ????????dog2.setName("索尼");??
  12. ????????dog2.setPrice(520.6f);??
  13. ??????????
  14. ????????List<Dog>?dogs=new?ArrayList<Dog>();??
  15. ????????dogs.add(dog1);??
  16. ????????dogs.add(dog2);??
  17. ????????server.addBeans(dogs);??
  18. ????????server.commit();??
  19. ????}??

?当然这个函数还是在之前写过的Root类中。
这样就可以完成了直接使用Java Pojo的文档提交。



?提交后,便可以查看我们的检索结果了。

?

Solr为我们提供了强大的后台查看。

添加有了,自然需要查询,那么接着来把查询的代码补上。

创建新的方法

Java代码??收藏代码
  1. public?static?void?searchDocMapToPojo(SolrServer?server)?throws?SolrServerException{??
  2. ????????SolrQuery?solrQuery?=?new??SolrQuery()??
  3. ????????????????????????.setQuery("comments:*德国")??
  4. ????????????????????????.setHighlight(true)??
  5. ????????????????????????.setHighlightSimplePost("</em>")??
  6. ????????????????????????.setHighlightSimplePre("<em>")??
  7. ????????????????????????.addHighlightField("comments");??
  8. ????????QueryResponse?rsp?=?server.query(solrQuery);??
  9. ????????List<Dog>?list=rsp.getBeans(Dog.class);??
  10. ????????System.out.println(list);??
  11. ????????for(int?i=0;i<list.size();i++){??
  12. ????????????System.out.println(rsp.getHighlighting().get(list.get(i).getId()).get("comments"));??
  13. ????????}??
  14. ????}??

?
这样执行后,可以看匹配到的高亮内容。

删除和修改,请查看solr api

http://dl.iteye.com/topics/download/b570d149-25a6-3dd1-8e82-c4a340009dcf

发表评论
用户名: 匿名