今天看到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文件夹,打开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文件放到项目依赖中去。


1. package
2.   
3. import
4.   
5. import
6. import
7. import
8.   
9. public class
10. public static void
11. new HttpSolrServer("http://localhost:8080/solr/core0/");  
12. try
13. //test
14. "*:*"
15. catch
16.             e.printStackTrace();  
17. catch
18.             e.printStackTrace();  
19.         }  
20.     }  
21. }


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


1. public static void addIndexDoc(SolrServer server) throws
2. //注意这里添加的字段名必须是 服务器上schema定义了的,不了解的请了解schema.xml去。
3.           
4. new
5. "id", "dog1001", 1.0f);  
6. "name", "jack", 1.0f);  
7. "price", 10);  
8.   
9. new
10. "id", "dog1002", 1.0f);  
11. "name", "jim", 1.0f);  
12. "price", 15);  
13.           
14. new
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目录中去

 

       
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字段为分词类型,如下图


       
1. SolrInputDocument doc1 = new
2. "id", "dog1003", 1.0f);  
3. "name", "lucy", 1.0f);  
4. "price", 10);  
5. "comments", "出生在上海,原名杨颖,香港新一代潮流教主,拥有四分之一baby童年照(10张)德国血统。爷爷是德国人。");  
6.   
7. new
8. "id", "dog1004", 1.0f);  
9. "name", "sim", 1.0f);  
10. "price", 15);  
11. "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;


       
1. package
2.   
3. import
4.   
5. public class
6. @Field
7. private
8. @Field
9. private
10. @Field
11. private
12. @Field
13. private
14. public
15. return
16.     }  
17. public void
18. this.id = id;  
19.     }  
20. public
21. return
22.     }  
23. public void
24. this.name = name;  
25.     }  
26. public
27. return
28.     }  
29. public void
30. this.price = price;  
31.     }  
32. public
33. return
34.     }  
35. public void
36. this.comments = comments;  
37.     }  
38.       
39. }


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

 

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

 

1. public static void addIndexDocWithPojo(SolrServer server) throws
2. new
3. "大家好,我是中国狗,我在北京");  
4. "dog1005");  
5. "天语");  
6. 520.6f);  
7.           
8. new
9. "大家好,我是日本狗,我在东京");  
10. "dog1006");  
11. "索尼");  
12. 520.6f);  
13.           
14. new
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
2. new
3. "comments:*德国")  
4. true)  
5. "</em>")  
6. "<em>")  
7. "comments");  
8.         QueryResponse rsp = server.query(solrQuery);  
9. class);  
10.         System.out.println(list);  
11. for(int i=0;i<list.size();i++){  
12. "comments"));  
13.         }  
14.     }


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

删除和修改,请查看solr api

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