全文搜索服务器 :Solr 4.0

http://www.aidansu.com/blog/1361.html

solr是我上周才接触的,一开始的时候很陌生,不知道从哪里开始,我从网上看了很多资料,并加以实践。我一开始就用最新版的solr 4.0,这个版本今年7月份才更新,而且改动幅度比较大,分词器也是刚刚才出了能兼容solr 4.0的版本,所以中文的参考资料很少,我就去看英文文档,把问题一个个地解决,现在已经可以开发出适合企业的版本了。以下是我在学习过程中的总结:

一、安装前的准备:

1、安装JDK 6+

2、安装Tomcat 6+

3、下载好Solr

下载地址:http://labs.mop.com/apache-mirror/lucene/solr/4.0.0/apache-solr-4.0.0.zip

二、Solr简易安装(体验版)

1、把下载下来的Solr加压好

2、打开命令提示符(开始–>运行–>cmd–>回车),cd到apache-solr-4.0.0文件夹下的example文件夹

3、输入命令:java -jar start.jar

4、打开浏览器输入网址:http://localhost:8983/solr/ 就可以浏览到solr的主页了

solr1

5、往solr添加数据:打开一个新的命令提示符,cd到apache-solr-4.0.0文件夹下的example文件夹下的 exampledocs文件夹,输入命令:java -jar post.jar -h 执行完毕后再输入:java -jar post.jar *.xml

6、尝试查询数据:打开浏览器输入网址:http://localhost:8983/solr/collection1/browse  在Find:输入窗口输入:ipod 按提交按钮即可搜索到有关ipod的信息。

solr2

 

三、Solr 4.0 + mmseg4j 1.9.0 中文分词 (尝试版)

1、下载mmseg4j 1.9.0

下载地http://mmseg4j.googlecode.com/files/mmseg4j-1.9.0.v20120712-SNAPSHOT.zip

2、解压mmseg4j 1.9.0到本地目录把apache-solr-4.0.0\example\webapps目录下solr.war文件复制到tomcat-6\webapps目录下

3、新建一个solr文件夹,把apache-solr-4.0.0\example\solr下的文件复制到新建的solr 文件夹下,在solr文件夹下新建两个文件夹,一个是lib,一个是dic,把mmseg4j 1.9.0文件夹下的mmseg4j-all-1.9.0.v20120712-SNAPSHOT.jar复制到lib文件夹下,把mmseg4j- 1.9.0.v20120712-SNAPSHOT\data文件夹下的dic文件复制到dic文件夹下

4、配置solr.home:打开 我的电脑–>属性–>高级–>环境变量,在系统变量中新建一个变量名:solr.home 变量值:f:/solr(你刚刚新建的solr文件的地址,我是建在F盘的)*主意:一定要按完所有的确定

5、修改 tomcat-6\conf\server.xml,加个 URIEncoding=”UTF-8″,把 8080 的那一块改为:

  1. <Connector port=“8080″ protocol=“HTTP/1.1″connectionTimeout=“20000″    
  2.     redirectPort=“8443″ URIEncoding=“UTF-8″/>  

 

6、把下面的内容保存到 tomcat-6\conf\Catalina\localhost\solr.xml,没有这个目录自行创建。

  1. <Context docBase=“F:/tomcat-6/webapps/solr.war”  reloadable=“true” >   
  2.     <Environment name=“solr/home” type=“java.lang.String”    
  3.         value=“F:/solr” override=“true” />   
  4. </Context>  

 

7、添加中文分词:修改solr文件夹(solr.home指定目录)下的collection1\conf\solrconfig.xml 加上<lib dir=”F:/solr/lib” /> 在collection\conf\schema.xml 在里面相应的标签内加入下面这几段代码:

  1. <field name=“simple” type=“textSimple” indexed=“true” stored=“true”/>   
  2. <field name=“complex” type=“textComplex” indexed=“true” stored=“true”/>   
  3. <field name=“MaxWord” type=“textMaxWord” indexed=“true” stored=“true”/>  

 

  1. <copyField source=“text” dest=“simple” />   
  2. <copyField source=“text” dest=“complex” />   
  3. <copyField source=“text” dest=“MaxWord” />   

 

  1. <fieldType name=“textComplex” class=“solr.TextField” >   
  2.     <analyzer>   
  3.         <tokenizer  class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”  
  4.             mode=“complex” dicPath=“F:/solr/dic”/>   
  5.     </analyzer>   
  6. </fieldType>   
  7.   
  8. <fieldType name=“textMaxWord” class=“solr.TextField” >   
  9.       <analyzer>   
  10.       <tokenizer  class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”  
  11.        mode=“max-word” dicPath=“F:/solr/dic”/>   
  12.   </analyzer>   
  13. </fieldType>   
  14.   
  15. <fieldType name=“textSimple” class=“solr.TextField” >   
  16.       <analyzer>   
  17.       <tokenizer  class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”  
  18.        mode=“simple” dicPath=“F:/solr/dic”/>   
  19.   </analyzer>   
  20. </fieldType>  

 

8、启动Tomcat,打开浏览器,输入:http://localhost:8080/solr/#/collection1/analysis FileType选择:MaxWord ,在Field Value (Index)输入中文,然后按Aanlyse Values 就会出行中文分词,如下图效果:

solr3

 

四、Solr 4.0 + Eclipse + IK Analyzer 2012 FF + MySQL中文分词 (企业开发版)

1、下载IK Analyzer 2012 FF并加压好

下载地址:http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012%20FF.zip

2、Solr 4.0 添加到eclipse project上:在eclipse上创建一个Dynamic Web Project项目名为SolrIK,把apache-solr-4.0.0\example\webapps目录下solr.war 文件加压好放在SolrIK项目下的WebRoot目录下(先删除目录下原有的文件),把apache-solr-4.0.0\example\下的 solr文件夹也复制到WebRoot目录下

3、修改SolrIK项目下WebRoot\WEB-INF\web.xml文件:找到

<!– People who want to hardcode their “Solr Home” directly into the WAR File can set the JNDI property here…–>

把下面那段去掉注释,改为:

  1. <env-entry>   
  2.    <env-entry-name>solr/home</env-entry-name>     
  3.    <env-entry-value>F:/webproject/SolrIK/WebRoot/solr   
  4.    </env-entry-value>   
  5.    <env-entry-type>java.lang.String</env-entry-type>   
  6. </env-entry>  

 

(<env-entry-value>这个是你存放solr文件的路径,我的项目是建在F:/webproject)

4、把项目添加到Tomcat里面去:打开eclipse –> Window –> Show View –> Servers ,然后在Servers里面右击 –> new Server –> 选择对应Tomcat 版本next –> 把SolrIK项目add进去 –> finish

solr5

双击 Tomcat v6.0 Server(上图蓝色区域),再点击Modules(上图顶部白色区域)如果没见到有上图的项目就在左边Add Web Modules

solr6

5、在Ecplise里启动Tomcat ,打开浏览器输入:http://localhost:8080/SolrIK/ 就可以浏览到Solr

6、添加IK Analyzer 2012 FF 中文分词:把IKAnalyzer2012_FF文件夹IKAnalyzer2012_FF.jar放在项目的WEB-INF下的lib目录下,修改 WebRoot\solr\collection1\schema.xml 在<types></types>里面加一条:

  1. <!– IK Analyzer 2012 FF  –>   
  2.   
  3. <fieldType name=“text_zh” class=“solr.TextField”>   
  4.   
  5. <analyzer class=“org.wltea.analyzer.lucene.IKAnalyzer”/>   
  6.   
  7. </fieldType>  

 

找到以下代码并把type=“text_general”修改为type=“text_zh

  1. <field  name=“text”  type=“text_zh”  indexed=“true” stored=“false” 
  2.          multiValued=“true”/>  

(修改后)

7、重启Tomcat ,打开浏览器,输入:http://localhost:8080/solr/#/collection1/analysis     FileType选择:text ,在Field Value (Index)输入中文,然后按Aanlyse Values 就会出行中文分词,如下图效果:

solr7

 

8、修改索引地址:(可以不修改,如果数据比多的时候就很难维护,建议修改)我在F盘下的tomcat-solr文件夹下建了一个data文件夹, 然后修改WebRoot\solr\collection1\conf\solrconfig.xml 下的<dataDir>${solr.data.dir:F:/tomcat-solr/data}< /dataDir> dir: 为你创建的索引地址路径

9、安装MySQL 数据库,并建立库为solrj,在其下面建立一个名为t_article的数据表,并把数据库驱动放在WebRoot\WEB-INF\lib目录下

solr15

10、在WebRoot\solr\collection1\conf下新建一个data-config.xml文件,在里面添加以下代码:(有些地方可能有点不同,如数据库密码)

  1. <?xml version=“1.0″ encoding=“UTF-8″ ?>   
  2.   
  3. <dataConfig>   
  4.     <dataSource name=“dstest” type=“JdbcDataSource” 
  5.         driver=“com.mysql.jdbc.Driver”    
  6.         url=“jdbc:mysql://localhost:3306/solrj?useUnicode=true&amp;
  7.         characterEncoding=UTF-8&amp;autoReconnect=true”    
  8.         user=“root” password=“mysql” />   
  9.      <document name=“articles”>   
  10.         <entity name=“article” dataSource=“ds-test” query=“select * from t_article ”  
  11.                 deltaQuery=“select id from t_article where  update_time >
  12.                 ’${dataimporter.last_index_time}’”>   
  13.             <field column=“id” name=“id” />   
  14.             <field column=“title” name=“title” />   
  15.             <field column=“content” name=“content” />          
  16.             <field column=“update_time” name=“updateTime” />   
  17.         </entity>   
  18.     </document>   
  19. </dataConfig>  

 

11、solr关联数据库:在WebRoot\solr\collection1\conf\solrconfig.xml 下找到相应的位置添加以下这段配置:

  1. <requestHandler name=“/dataimport” class=“org.apache.solr  
  2.     .handler.dataimport.DataImportHandler”>   
  3. <lst name=“defaults”>   
  4. <str name=“config”>data-config.xml</str>   
  5. </lst>   
  6. </requestHandler>  

 

在WebRoot\solr\collection1\conf\schema.xml 下找到下面的代码,并把
type=“text_general”修改为type=“text_zh(分词方法):

  1. <field  name=“title”  type=“text_zh”   indexed=“true”  
  2. stored=“true” multiValued=“true”/>   
  3.   
  4. <field  name=“content”  type=“text_zh”  indexed=“false”  
  5. stored=“true” multiValued=“true”/>  

 

12、导入数据到solr:打开http://localhost:8080/SolrIK/#/collection1/dataimport//dataimportCommand里把Clean、Commit和Optimize打钩,再点击Execute Import(蓝色按钮)

solr11

13、打开查询页面,输入q输入框下输入外交部 即可查到两条关于外交部的数据

solr16

 

14、创建solr客户端:先导入包,把apache-solr-4.0.0\dist下的apache-solr

-dataimporthandler-4.0.0.jar 和 apache-solr-dataimporthandler-extras-4.0.0.jar复制到

WebRoot\WEB-INF\lib下,在src下创建一个SolrJSearcheDemo类:

  1. package com.aidansu.web.solrj;   
  2.   
  3. import java.net.MalformedURLException;   
  4. import java.util.List;   
  5. import java.util.Map;   
  6. import org.apache.solr.client.solrj.SolrQuery;   
  7. import org.apache.solr.client.solrj.SolrServer;   
  8. import org.apache.solr.client.solrj.SolrServerException;   
  9. import org.apache.solr.client.solrj.impl.HttpSolrServer;   
  10. import org.apache.solr.client.solrj.response.QueryResponse;   
  11. import org.apache.solr.common.SolrDocument;   
  12. import org.apache.solr.common.SolrDocumentList;   
  13.   
  14. /**
  15.  *   
  16.  * @className:SolrJSearcheDemo.java  
  17.  * @classDescription: Solr客户端-查询  
  18.  * @author: AIDAN SU  
  19.  * @createTime: 2012-10-23  
  20.  *  
  21.  */  
  22. public class SolrJSearcheDemo {   
  23.     /**
  24.      * Solr访问地址  
  25.      */  
  26.     private static final String SOLR_URL =“http://localhost:8081/SolrIK/”;   
  27.        
  28.     // 通过网络地址获取SolrServer对象   
  29.     public SolrServer getSolrServer() throws MalformedURLException {   
  30.            
  31.         return new HttpSolrServer(SOLR_URL);   
  32.     }   
  33.         
  34.     // 查询方法     
  35.     public void search(String key) throws MalformedURLException{     
  36.         SolrServer solrServer = getSolrServer();   
  37.         // 查询对象   
  38.         SolrQuery query = new SolrQuery(key);         
  39.        
  40.         query.setQuery(key);    
  41.              
  42.         try {      
  43.                
  44.             query.setHighlight(true)   
  45.                 //设置开头   
  46.                 .setHighlightSimplePre(“<span class=’highlight’>”)   
  47.                 .setHighlightSimplePost(“</span>”//设置结尾   
  48.                 .setStart(0)    
  49.                 .setRows(10);//设置行数   
  50.             //设置高亮的哪些区域   
  51.             query.setParam(“hl.fl”“content”);   
  52.             QueryResponse response=solrServer.query(query);;   
  53.             SolrDocumentList list=response.getResults();   
  54.                
  55.             System.out.println(“高亮显示:”);   
  56.             for(SolrDocument sd:list){   
  57.                 String id=(String) sd.getFieldValue(“id”);   
  58.                 if(response.getHighlighting().get(id)!=null){   
  59.                     System.out.println(response.getHighlighting()   
  60.                         .get(id).get(“content”));   
  61.        
  62.                 }   
  63.             }   
  64.                
  65.             System.out.println(“——————————————-”);   
  66.                
  67.             SolrDocumentList docs = response.getResults();     
  68.             
  69.             System.out.println(“文档个数:” + docs.getNumFound());     
  70.             System.out.println(“查询时间:” + response.getQTime());   
  71.             System.out.println(“——————————————–”);   
  72.                
  73.             for (SolrDocument doc : docs) {     
  74.                    
  75.                 // 获取查询返回结果   
  76.                 String id = doc.getFieldValue(“id”).toString();     
  77.                 String title = doc.getFirstValue(“title”).toString();     
  78.                 String content = doc.getFirstValue(“content”).toString();   
  79.                    
  80.                 // 打印查询结果   
  81.                 System.out.println(“编号:”+id);     
  82.                 System.out.println(“标题:”+title);    
  83.                 System.out.println(“内容: ”+content);    
  84.            
  85.                 System.out.println(“—————————————-”);   
  86.                    
  87.             }     
  88.                
  89.   
  90.         } catch (SolrServerException e) {     
  91.              e.printStackTrace();     
  92.         }      
  93.     }     
  94.        
  95.        
  96.     public static void main(String[] args) throws MalformedURLException {    
  97.            
  98.         // 创建一个SolrJSearcheDemo对象   
  99.         SolrJSearcheDemo sj = new SolrJSearcheDemo();    
  100.         // 查询条件   
  101.         String Query =“外交部”;   
  102.         // 调用查询方法   
  103.         sj.search(Query);     
  104.     }     
  105.        
  106. }    

 

solr17
15、创建solr jsp页面客户端:通过JavaScript和Ajax 完成Json的解析并显示在网页上。

在WebRoot目录下新建一个search.jsp页面,代码如下:

  1. <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8″%>   
  2. <html>   
  3. <head>   
  4. <title>json</title>   
  5. <script type=“text/javascript”>   
  6. function xmlhttpPost(strURL) {   
  7.     var xmlHttpReq = false;   
  8.     var self = this;   
  9.     if (window.XMLHttpRequest) { // Mozilla/Safari   
  10.         self.xmlHttpReq = new XMLHttpRequest();    
  11.     }   
  12.     else if (window.ActiveXObject) { // IE   
  13.         self.xmlHttpReq = new ActiveXObject(“Microsoft.XMLHTTP”);   
  14.     }   
  15.        
  16.     var params = getstandardargs().concat(getquerystring());   
  17.     var strData = params.join(‘&’);   
  18.        
  19.     //var header = document.getElementById(“response”);   
  20.     //header.innerHTML = strURL+’?'+strData;   
  21.   
  22.     self.xmlHttpReq.open(‘get’, strURL+’?'+strData   
  23.         +’&time=’+new Date().getTime(), true);   
  24.     self.xmlHttpReq.setRequestHeader(‘Content-Type’,   
  25.         ’application/x-www-form-urlencoded’);   
  26.     self.xmlHttpReq.onreadystatechange = function() {   
  27.         if (self.xmlHttpReq.readyState == 4) {   
  28.             updatepage(self.xmlHttpReq.responseText);   
  29.         }   
  30.     }   
  31.     self.xmlHttpReq.send(null);   
  32. }   
  33.   
  34. function getstandardargs() {   
  35.     var params = [   
  36.         'wt=json'   
  37.         , 'indent=on'   
  38.         , 'hl=true'   
  39.         , 'hl.fl=title,content'   
  40.         , 'fl=*,title,content'   
  41.         , 'start=0'   
  42.         , 'rows=10'   
  43.         ];   
  44.   
  45.     return params;   
  46. }   
  47. function getquerystring() {   
  48.   var form = document.forms['f1'];   
  49.   var query = form.q.value;   
  50.   qstr = ’q=’ + encodeURI(query);    //escape   
  51.   return qstr;   
  52. }   
  53.   
  54. // this function does all the work of parsing the solr    
  55. //response and updating the page.   
  56. function updatepage(str){   
  57.   //document.getElementById(“response”).innerHTML = str;   
  58.   // use eval to parse Solr’s JSON response   
  59.   var rsp = eval(“(“+str+“)”);   
  60.   parse(rsp);   
  61. }   
  62.   
  63. function parse(j) {   
  64.     var header = document.getElementById(“header”);   
  65.     var rh = j.responseHeader;   
  66.     try{   
  67.     var hl = j.highlighting;   
  68.     }catch(exception){}   
  69.     var header_str = “ 搜索: \”"+rh.params.q+“\”, 花了: ”+rh.QTime+“ms, 共显示: ”  
  70.     +j.response.numFound+“条记录”;  //+rh.params.rows;   
  71.     header.innerHTML = header_str;   
  72.     var docs = j.response.docs;     
  73.     var tab = document.getElementById(“docs”);   
  74.     for(; tab.rows.length >1; ) {   
  75.         tab.deleteRow(-1);   
  76.     }   
  77.     var tr;   
  78.     var td;   
  79.     var hid;   
  80.     for(var i=0; i<docs.length; i++) {   
  81.            
  82.         tr = tab.insertRow(-1);   
  83.            
  84.         td = tr.insertCell(-1);   
  85.         td.innerHTML = docs[i].id;   
  86.         hid = docs[i].id;   
  87.            
  88.         td = tr.insertCell(-1);   
  89.         if(hl != null){   
  90.             try{   
  91.                 if(hl[hid].title != null){   
  92.                     td.innerHTML = hl[hid].title;      
  93.                        
  94.                 }else{   
  95.                     td.innerHTML = docs[i].title;   
  96.                 }   
  97.             }catch(exception){   
  98.             }   
  99.         }else{   
  100.             td.innerHTML = docs[i].title;   
  101.         }   
  102.            
  103.         td = tr.insertCell(-1);   
  104.         if(hl != null){   
  105.             try{   
  106.                 if(hl[hid].content != null){   
  107.                     td.innerHTML = hl[hid].content;    
  108.                        
  109.                 }else{   
  110.                     td.innerHTML = docs[i].content;   
  111.                 }   
  112.             }catch(exception){   
  113.             }   
  114.         }else{   
  115.             td.innerHTML = docs[i].content;   
  116.         }   
  117.     }   
  118.        
  119.        
  120.    }   
  121. </script>   
  122. </head>   
  123. <body>   
  124. <form action=“select/” name=“f1″ method=“get”    
  125.     οnsubmit=“xmlhttpPost(‘/SolrIK/select’); return false;” >   
  126.       Find:    
  127.       <input type=“text” name=“q” size=“80″ >   
  128.       <input name=“start” type=“hidden” value=“0″>   
  129.       <input name=“rows” type=“hidden” value=“10″>   
  130.       <input name=“indent” type=“hidden” value=“on”>   
  131.       <input name=“wt” type=“hidden” value=“”>   
  132.       <input name=“hl” type=“hidden” value=“true”>   
  133.       <input name=“hl.fl” type=“hidden” value=“title,content”>   
  134.       <input name=“fl” type=“hidden” value=“*,title,content”>   
  135.       <input type=“button” value=“ 搜 索 ” 
  136.                  οnclick=“xmlhttpPost(‘/SolrIK/select’);”>   
  137.       <input type=“button” value=“ get json ”    
  138.       οnclick=“document.forms['f1'].wt
  139.        .value=’json’;document.forms['f1'].submit();”>   
  140.       <input type=“button” value=“ get xml ”    
  141.       οnclick=“document.forms['f1'].wt
  142.       .value=”;document.forms['f1'].submit();”>   
  143.   </form>   
  144.     <div id=“header”></div>   
  145.     <div id=“response”></div>   
  146.   <div style=“background-color: #000000; height: 1px; margin-top:10px; margin-bottom:10px;”>   
  147.   </div>   
  148.      
  149.     <table id=“docs” class=“tab” cellspacing=“1″>   
  150.         <tr>   
  151.             <td width=“50″>编号</td>   
  152.             <td width=“400″>标题</td>   
  153.             <td >内容</td>   
  154.         </tr>   
  155.     </table>   
  156. </body>   
  157. </html>  

效果如下:

solr18

下面的开发就不写了,对于企业搜索的开发上面这些功能可能还不够用,那就多研究一下!教程如有写得不好的地方请见谅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值