当网站数据量达到一定规模时,我们会发现搜索的速度越来越慢。在这种情况下我们可以找出消耗性能的语句对数据库、代码做必要的优化,但是这不是万能的,当我们发现网页访问的速度因为数据库本身的性能造成瓶颈的时候,就要考虑使用全文索引技术了。
做 过.net 的同学应该都听说过Lucene.net,而Solr是一个高性能,采用Java5开发, 基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,实现了可配置、可扩展并对查询性能进行了优化,并且提 供了一个完善的功能管理界面。因此我们选择Solr。
首先 下载安装 JDK 、 tomcat 下载 solr 将solr解压到磁盘。
创建solr工作目录 d:\SorlHome 把下载的solr文件夹中example/solr下的所有文件拷贝到 d:\solorhome目录下 ,同时把下载的solr文件夹中 dist 下 solr-4.10.3.war 文件 也拷贝过来,改名为 solr.war
打开 tomcat的安装目录,在conf/catalina/localhost 下添加 solr.xml 文件 在tomcat 中注册 Solr
<?xml version="1.0" encoding="UTF-8"?> <Context docBase="D:/SorlHome/solr.war" reloadable="true"> <Environment name="solr/home" type="java.lang.String" value="D:/SorlHome" override="true"/> </Context>
把下载的solr文件夹中example\lib\ext 复制到 tomcat 的apache-tomcat-7.0.59\lib目录下面
如果缺少这一步运行时会报找不到架包的错误
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.apache.http.impl.client.CloseableHttpClient.<init>(CloseableHttpClient.java:60) at org.apache.http.impl.client.AbstractHttpClient.<init>(AbstractHttpClient.java:271) at org.apache.http.impl.client.DefaultHttpClient.<init>(DefaultHttpClient.java:127) at org.apache.http.impl.client.SystemDefaultHttpClient.<init>(SystemDefaultHttpClient.java:116) at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:117) at org.apache.solr.servlet.SolrDispatchFilter.<init>(SolrDispatchFilter.java:120) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at java.lang.Class.newInstance(Class.java:438) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:116) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4854) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5542) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:672) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1859) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) ... 27 more
重启tomcat 看看跑起来没
下面就要配置中文分词了,目前比较好的分词器有 IK Analyzer paoding(疱丁解牛)imdict mmseg4j 这里选择用 IK
下载IK 把 IK-Analyzer-2012FF\dist 目录下的架包复制到 tomcat 的\webapps\solr\WEB-INF\lib目录下面 并创建 classes 文件夹
把 IKAnalyzer.cfg.xml、 stopword.dic 文件复制到新建的 class文件夹下面
打开 d:\SorlHome 目录 修改 /collection1/conf/schema.xml 文件 在根节点下添加节点
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
找到下面几个节点,把 type 属性改为 “text_ik", 在121行附近。
<field name="name" type="text_ik" indexed="true" stored="true"/> <field name="manu" type="text_ik" indexed="true" stored="true" omitNorms="true"/>
重启tomcat,访问 http://localhost:8080/solr/ 选择 collection1 -> Analysis
Analyse Fieldname/ FieldType 选择刚才配置的 "text_ik" 点击Analyse Vlaues 按钮看看效果吧
Ok!基本工作完成了。下面还有很多工作要做,不急慢慢来。