Solr4.0搭建应用

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

好吧,下载完毕后,我们解压,看到下图 

之后进入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了. 
Solr4.0搭建应用_第3张图片

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

Solr4.0搭建应用_第4张图片 

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

 

Tomcat部署Solr

 

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

Solr4.0搭建应用_第5张图片

 启动Tomcat

报错信息如下


Solr4.0搭建应用_第6张图片

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

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

Solr4.0搭建应用_第7张图片
 回到Solr4.0解压后的文件夹的example目录下,我们看到multicore


 

 


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

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

 

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

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

Solr4.0搭建应用_第8张图片
 新建一个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.     }  

 
执行添加方法

添加成功后,查询如下图


Solr4.0搭建应用_第9张图片

 

这说明我们添加成功

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

 

将压缩包解压,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字段为分词类型,如下图
Solr4.0搭建应用_第10张图片
 

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浏览器

Solr4.0搭建应用_第11张图片
 很好,我们看到了查询结果


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

之前使用的都是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的文档提交。


Solr4.0搭建应用_第12张图片
 提交后,便可以查看我们的检索结果了。
Solr4.0搭建应用_第13张图片

 

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

你可能感兴趣的:(java,搜索引擎,Solr,Lucene,Solr4.0搭建应用)