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的主页了
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的信息。
三、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 的那一块改为:
- <Connector port=“8080″ protocol=“HTTP/1.1″connectionTimeout=“20000″
- redirectPort=“8443″ URIEncoding=“UTF-8″/>
6、把下面的内容保存到 tomcat-6\conf\Catalina\localhost\solr.xml,没有这个目录自行创建。
- <Context docBase=“F:/tomcat-6/webapps/solr.war” reloadable=“true” >
- <Environment name=“solr/home” type=“java.lang.String”
- value=“F:/solr” override=“true” />
- </Context>
7、添加中文分词:修改solr文件夹(solr.home指定目录)下的collection1\conf\solrconfig.xml 加上<lib dir=”F:/solr/lib” /> 在collection\conf\schema.xml 在里面相应的标签内加入下面这几段代码:
- <field name=“simple” type=“textSimple” indexed=“true” stored=“true”/>
- <field name=“complex” type=“textComplex” indexed=“true” stored=“true”/>
- <field name=“MaxWord” type=“textMaxWord” indexed=“true” stored=“true”/>
- <copyField source=“text” dest=“simple” />
- <copyField source=“text” dest=“complex” />
- <copyField source=“text” dest=“MaxWord” />
- <fieldType name=“textComplex” class=“solr.TextField” >
- <analyzer>
- <tokenizer class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”
- mode=“complex” dicPath=“F:/solr/dic”/>
- </analyzer>
- </fieldType>
- <fieldType name=“textMaxWord” class=“solr.TextField” >
- <analyzer>
- <tokenizer class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”
- mode=“max-word” dicPath=“F:/solr/dic”/>
- </analyzer>
- </fieldType>
- <fieldType name=“textSimple” class=“solr.TextField” >
- <analyzer>
- <tokenizer class=“com.chenlb.mmseg4j.solr.MMSegTokenizerFactory”
- mode=“simple” dicPath=“F:/solr/dic”/>
- </analyzer>
- </fieldType>
8、启动Tomcat,打开浏览器,输入:http://localhost:8080/solr/#/collection1/analysis FileType选择:MaxWord ,在Field Value (Index)输入中文,然后按Aanlyse Values 就会出行中文分词,如下图效果:
四、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…–>
把下面那段去掉注释,改为:
- <env-entry>
- <env-entry-name>solr/home</env-entry-name>
- <env-entry-value>F:/webproject/SolrIK/WebRoot/solr
- </env-entry-value>
- <env-entry-type>java.lang.String</env-entry-type>
- </env-entry>
(<env-entry-value>这个是你存放solr文件的路径,我的项目是建在F:/webproject)
4、把项目添加到Tomcat里面去:打开eclipse –> Window –> Show View –> Servers ,然后在Servers里面右击 –> new Server –> 选择对应Tomcat 版本next –> 把SolrIK项目add进去 –> finish
双击 Tomcat v6.0 Server(上图蓝色区域),再点击Modules(上图顶部白色区域)如果没见到有上图的项目就在左边Add Web Modules
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>里面加一条:
- <!– IK Analyzer 2012 FF –>
- <fieldType name=“text_zh” class=“solr.TextField”>
- <analyzer class=“org.wltea.analyzer.lucene.IKAnalyzer”/>
- </fieldType>
找到以下代码并把type=“text_general”修改为type=“text_zh“:
- <field name=“text” type=“text_zh” indexed=“true” stored=“false”
- multiValued=“true”/>
(修改后)
7、重启Tomcat ,打开浏览器,输入:http://localhost:8080/solr/#/collection1/analysis FileType选择:text ,在Field Value (Index)输入中文,然后按Aanlyse Values 就会出行中文分词,如下图效果:
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目录下
10、在WebRoot\solr\collection1\conf下新建一个data-config.xml文件,在里面添加以下代码:(有些地方可能有点不同,如数据库密码)
- <?xml version=“1.0″ encoding=“UTF-8″ ?>
- <dataConfig>
- <dataSource name=“dstest” type=“JdbcDataSource”
- driver=“com.mysql.jdbc.Driver”
- url=“jdbc:mysql://localhost:3306/solrj?useUnicode=true&
- characterEncoding=UTF-8&autoReconnect=true”
- user=“root” password=“mysql” />
- <document name=“articles”>
- <entity name=“article” dataSource=“ds-test” query=“select * from t_article ”
- deltaQuery=“select id from t_article where update_time >
- ’${dataimporter.last_index_time}’”>
- <field column=“id” name=“id” />
- <field column=“title” name=“title” />
- <field column=“content” name=“content” />
- <field column=“update_time” name=“updateTime” />
- </entity>
- </document>
- </dataConfig>
11、solr关联数据库:在WebRoot\solr\collection1\conf\solrconfig.xml 下找到相应的位置添加以下这段配置:
- <requestHandler name=“/dataimport” class=“org.apache.solr
- .handler.dataimport.DataImportHandler”>
- <lst name=“defaults”>
- <str name=“config”>data-config.xml</str>
- </lst>
- </requestHandler>
在WebRoot\solr\collection1\conf\schema.xml 下找到下面的代码,并把
type=“text_general”修改为type=“text_zh“(分词方法):
- <field name=“title” type=“text_zh” indexed=“true”
- stored=“true” multiValued=“true”/>
- <field name=“content” type=“text_zh” indexed=“false”
- stored=“true” multiValued=“true”/>
12、导入数据到solr:打开http://localhost:8080/SolrIK/#/collection1/dataimport//dataimportCommand里把Clean、Commit和Optimize打钩,再点击Execute Import(蓝色按钮)
13、打开查询页面,输入q输入框下输入外交部 即可查到两条关于外交部的数据
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类:
- package com.aidansu.web.solrj;
- import java.net.MalformedURLException;
- import java.util.List;
- import java.util.Map;
- import org.apache.solr.client.solrj.SolrQuery;
- import org.apache.solr.client.solrj.SolrServer;
- import org.apache.solr.client.solrj.SolrServerException;
- import org.apache.solr.client.solrj.impl.HttpSolrServer;
- import org.apache.solr.client.solrj.response.QueryResponse;
- import org.apache.solr.common.SolrDocument;
- import org.apache.solr.common.SolrDocumentList;
- /**
- *
- * @className:SolrJSearcheDemo.java
- * @classDescription: Solr客户端-查询
- * @author: AIDAN SU
- * @createTime: 2012-10-23
- *
- */
- public class SolrJSearcheDemo {
- /**
- * Solr访问地址
- */
- private static final String SOLR_URL =“http://localhost:8081/SolrIK/”;
- // 通过网络地址获取SolrServer对象
- public SolrServer getSolrServer() throws MalformedURLException {
- return new HttpSolrServer(SOLR_URL);
- }
- // 查询方法
- public void search(String key) throws MalformedURLException{
- SolrServer solrServer = getSolrServer();
- // 查询对象
- SolrQuery query = new SolrQuery(key);
- query.setQuery(key);
- try {
- query.setHighlight(true)
- //设置开头
- .setHighlightSimplePre(“<span class=’highlight’>”)
- .setHighlightSimplePost(“</span>”) //设置结尾
- .setStart(0)
- .setRows(10);//设置行数
- //设置高亮的哪些区域
- query.setParam(“hl.fl”, “content”);
- QueryResponse response=solrServer.query(query);;
- SolrDocumentList list=response.getResults();
- System.out.println(“高亮显示:”);
- for(SolrDocument sd:list){
- String id=(String) sd.getFieldValue(“id”);
- if(response.getHighlighting().get(id)!=null){
- System.out.println(response.getHighlighting()
- .get(id).get(“content”));
- }
- }
- System.out.println(“——————————————-”);
- SolrDocumentList docs = response.getResults();
- System.out.println(“文档个数:” + docs.getNumFound());
- System.out.println(“查询时间:” + response.getQTime());
- System.out.println(“——————————————–”);
- for (SolrDocument doc : docs) {
- // 获取查询返回结果
- String id = doc.getFieldValue(“id”).toString();
- String title = doc.getFirstValue(“title”).toString();
- String content = doc.getFirstValue(“content”).toString();
- // 打印查询结果
- System.out.println(“编号:”+id);
- System.out.println(“标题:”+title);
- System.out.println(“内容: ”+content);
- System.out.println(“—————————————-”);
- }
- } catch (SolrServerException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws MalformedURLException {
- // 创建一个SolrJSearcheDemo对象
- SolrJSearcheDemo sj = new SolrJSearcheDemo();
- // 查询条件
- String Query =“外交部”;
- // 调用查询方法
- sj.search(Query);
- }
- }
15、创建solr jsp页面客户端:通过JavaScript和Ajax 完成Json的解析并显示在网页上。
在WebRoot目录下新建一个search.jsp页面,代码如下:
- <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8″%>
- <html>
- <head>
- <title>json</title>
- <script type=“text/javascript”>
- function xmlhttpPost(strURL) {
- var xmlHttpReq = false;
- var self = this;
- if (window.XMLHttpRequest) { // Mozilla/Safari
- self.xmlHttpReq = new XMLHttpRequest();
- }
- else if (window.ActiveXObject) { // IE
- self.xmlHttpReq = new ActiveXObject(“Microsoft.XMLHTTP”);
- }
- var params = getstandardargs().concat(getquerystring());
- var strData = params.join(‘&’);
- //var header = document.getElementById(“response”);
- //header.innerHTML = strURL+’?'+strData;
- self.xmlHttpReq.open(‘get’, strURL+’?'+strData
- +’&time=’+new Date().getTime(), true);
- self.xmlHttpReq.setRequestHeader(‘Content-Type’,
- ’application/x-www-form-urlencoded’);
- self.xmlHttpReq.onreadystatechange = function() {
- if (self.xmlHttpReq.readyState == 4) {
- updatepage(self.xmlHttpReq.responseText);
- }
- }
- self.xmlHttpReq.send(null);
- }
- function getstandardargs() {
- var params = [
- 'wt=json'
- , 'indent=on'
- , 'hl=true'
- , 'hl.fl=title,content'
- , 'fl=*,title,content'
- , 'start=0'
- , 'rows=10'
- ];
- return params;
- }
- function getquerystring() {
- var form = document.forms['f1'];
- var query = form.q.value;
- qstr = ’q=’ + encodeURI(query); //escape
- return qstr;
- }
- // this function does all the work of parsing the solr
- //response and updating the page.
- function updatepage(str){
- //document.getElementById(“response”).innerHTML = str;
- // use eval to parse Solr’s JSON response
- var rsp = eval(“(“+str+“)”);
- parse(rsp);
- }
- function parse(j) {
- var header = document.getElementById(“header”);
- var rh = j.responseHeader;
- try{
- var hl = j.highlighting;
- }catch(exception){}
- var header_str = “ 搜索: \”"+rh.params.q+“\”, 花了: ”+rh.QTime+“ms, 共显示: ”
- +j.response.numFound+“条记录”; //+rh.params.rows;
- header.innerHTML = header_str;
- var docs = j.response.docs;
- var tab = document.getElementById(“docs”);
- for(; tab.rows.length >1; ) {
- tab.deleteRow(-1);
- }
- var tr;
- var td;
- var hid;
- for(var i=0; i<docs.length; i++) {
- tr = tab.insertRow(-1);
- td = tr.insertCell(-1);
- td.innerHTML = docs[i].id;
- hid = docs[i].id;
- td = tr.insertCell(-1);
- if(hl != null){
- try{
- if(hl[hid].title != null){
- td.innerHTML = hl[hid].title;
- }else{
- td.innerHTML = docs[i].title;
- }
- }catch(exception){
- }
- }else{
- td.innerHTML = docs[i].title;
- }
- td = tr.insertCell(-1);
- if(hl != null){
- try{
- if(hl[hid].content != null){
- td.innerHTML = hl[hid].content;
- }else{
- td.innerHTML = docs[i].content;
- }
- }catch(exception){
- }
- }else{
- td.innerHTML = docs[i].content;
- }
- }
- }
- </script>
- </head>
- <body>
- <form action=“select/” name=“f1″ method=“get”
- οnsubmit=“xmlhttpPost(‘/SolrIK/select’); return false;” >
- Find:
- <input type=“text” name=“q” size=“80″ >
- <input name=“start” type=“hidden” value=“0″>
- <input name=“rows” type=“hidden” value=“10″>
- <input name=“indent” type=“hidden” value=“on”>
- <input name=“wt” type=“hidden” value=“”>
- <input name=“hl” type=“hidden” value=“true”>
- <input name=“hl.fl” type=“hidden” value=“title,content”>
- <input name=“fl” type=“hidden” value=“*,title,content”>
- <input type=“button” value=“ 搜 索 ”
- οnclick=“xmlhttpPost(‘/SolrIK/select’);”>
- <input type=“button” value=“ get json ”
- οnclick=“document.forms['f1'].wt
- .value=’json’;document.forms['f1'].submit();”>
- <input type=“button” value=“ get xml ”
- οnclick=“document.forms['f1'].wt
- .value=”;document.forms['f1'].submit();”>
- </form>
- <div id=“header”></div>
- <div id=“response”></div>
- <div style=“background-color: #000000; height: 1px; margin-top:10px; margin-bottom:10px;”>
- </div>
- <table id=“docs” class=“tab” cellspacing=“1″>
- <tr>
- <td width=“50″>编号</td>
- <td width=“400″>标题</td>
- <td >内容</td>
- </tr>
- </table>
- </body>
- </html>
效果如下:
下面的开发就不写了,对于企业搜索的开发上面这些功能可能还不够用,那就多研究一下!教程如有写得不好的地方请见谅!