设为首页 收藏本站
查看: 1506|回复: 0

[经验分享] Solr的配置及从数据库建立索引

[复制链接]

尚未签到

发表于 2015-11-12 10:08:15 | 显示全部楼层 |阅读模式
  

  
1 Solr 简介

    Solr 是一个基于 Lucene 的 Java 搜索引擎服务器。 Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。 Solr 已经在众多大型的网站中使用,较为成熟和稳定。 Solr 包装并扩展了 Lucene ,所以 Solr 的基本上沿用了 Lucene 的相关术语。更重要的是, Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码, Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch 、 Luke )也可以使用 Solr 创建的索引。

2 、Ubuntu Solr 安装配置

    由于 Solr 基于 java 开发,因此 Solr 在 windows 及 Linux 都能较好部署使用,但由于 Solr 提供了一些用于测试及管理、维护较为方便的 shell 脚本,因此在生产部署时候建议安装在 Linux 上,测试时候可以在 windows 使用。

下面以 Ubuntu 下安装配置 Solr 进行说明。

首先下载Tomcat的压缩包。


unzip apache-tomcat-6.0.16.zip

mv apache-tomcat-6.0.16 /opt/tomcat

chmod 755 /opt/tomcat/bin/*

  

下载apache-solr-1.4.0压缩包。tar -xvf apache-solr-1.2.0.tgz


Solr 的安装配置最为麻烦的是对 solr.solr.home 的理解和配置,主要有三种


  • 基于当前路径的方式

cp apache-solr-1.4.0/dist/apache-solr-1.4.0.war /opt/tomcat/webapps/solr.war

mkdir /opt/solr-tomcat

cp -r apache-solr-1.2.0/example/solr/ /opt/solr-tomcat/

cd /opt/solr-tomcat

/opt/tomcat/bin/startup.sh

由于在此种情况下(没有设定 solr.solr.home 环境变量或 JNDI 的情况下), Solr 查找 ./solr ,因此在启动时候需要切换到 /opt/solr-tomcat


  • 基于环境变量 solr.solr.home

在当前用户的环境变量中( .bash_profile )或在 /opt/tomcat/catalina.sh 中添加如下环境变量

export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"


  • 基于 JNDI 配置

mkdir –p /opt/tomcat/conf/Catalina/localhost

touch /opt/tomcat/conf/Catalina/localhost/solr.xml ,内容如下 :

      <Context docBase="/opt/tomcat/webapps/solr" debug="0" crossContext="true" >

                 <Environment name="solr/home" type="java.lang.String" value="/opt/solr-tomcat/solr" override="true" />

    </Context>

访问 solr 管理界面 http://127.0.0.1:8080/solr

3 、用solr从数据库建立中文索引
1.在Ubuntu下安装mysql服务端和客户端。

#apt-get install mysql-server-5.0

#apt-get install mysql
2.添加Handler
    编辑/opt/solr-tomcat/solr/conf文件夹下的solrconfig.xml文件,在config元素中添加

< requestHandler   name = "/dataimport"   class = "org.apache.solr.handler.dataimport.DataImportHandler" >   < lst   name = "defaults" >   < str   name = "config" > data-config.xml </ str >   </ lst >   </ requestHandler >   

3.  在此文件夹中新建一个data-config.xml文件,内容如下

<dataConfig><dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://127.0.0.1:3306/db_expert" user="root" password="root"/><document><entity name="expert" query="select id,experName,researchfield,title,workunit,postaladdress,officephone,email,biography from expertinfo"></entity></document></dataConfig>

4.  修改schema.xml,找到<fieldType name="text",将分词器修改为中文分词器,这里用的是包装过的Paoding分词,这个东西好像已经不更新了,以后看看IKAnalyzer吧。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="net.paoding.analysis.analyzer.ChineseTokenizerFactory" mode="most-words"/><!-- in this example, we will only use synonyms at query time<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>--><!-- Case insensitive stop word removal.add enablePositionIncrements=true in both the index and queryanalyzers to leave a 'gap' for more accurate phrase queries.--><filter class="solr.StopFilterFactory"ignoreCase="true"words="stopwords.txt"enablePositionIncrements="true"/><filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/>    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/><filter class="solr.RemoveDuplicatesTokenFilterFactory"/>    </analyzer>    <analyzer type="query">    <tokenizer class="net.paoding.analysis.analyzer.ChineseTokenizerFactory" mode="most-words"/>                    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>   <filter class="solr.StopFilterFactory"ignoreCase="true"words="stopwords.txt"enablePositionIncrements="true"/><filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/>    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/></analyzer></fieldType>

原来的schema.xml中没有的字段自己添加上。schema.xml默认是UTF-8编码。首先在<fields></fields>里添加要索引的域。

注意:数据库的表的主键的名字最好是id,以后才好办。

<field name="id" type="int" indexed="true" stored="true" required="true" /> <field name="experName"  type="text" indexed="true" stored="true"/><field name="researchfield"  type="text" indexed="true" stored="true"/><field name="title"  type="text" indexed="true" stored="true"/><field name="workunit"  type="text" indexed="true" stored="true"/><field name="postaladdress"  type="text" indexed="true" stored="true"/><field name="officephone"  type="text" indexed="true" stored="true"/><field name="email"  type="text" indexed="true" stored="true"/><field name="biography"  type="text" indexed="true" stored="true"/>

然后在<solrQueryParser defaultOperator="OR"/>下面添加下面行。

<copyField source="experName" dest="text" /><copyField source="researchfield" dest="text" /><copyField source="title" dest="text" /><copyField source="workunit" dest="text" /><copyField source="postaladdress" dest="text" /><copyField source="officephone" dest="text" /><copyField source="email" dest="text" /><copyField source="biography" dest="text" />

5.  包装Paoding的分词器

     1. package  net.paoding.analysis.analyzer;  2.   3. import  java.io.Reader;  4. import  java.util.Map;  5.   6. import  net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;  7. import  net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;  8. import  net.paoding.analysis.knife.PaodingMaker;  9.   10. import  org.apache.lucene.analysis.Tokenizer;  11. import  org.apache.solr.analysis.BaseTokenizerFactory;  12.   13. /**  14.  * Created by IntelliJ IDEA.   15.  * User: ronghao   16.  * Date: 2007-11-3   17.  * Time: 14:40:59 中文切词 对庖丁切词的封装  18.  */   19. public   class  ChineseTokenizerFactory  extends  BaseTokenizerFactory {  20.     /**  21.      * 最多切分 默认模式  22.      */   23.     public   static   final  String MOST_WORDS_MODE =  "most-words" ;  24.     /**  25.      * 按最大切分  26.      */   27.     public   static   final  String MAX_WORD_LENGTH_MODE =  "max-word-length" ;  28.   29.     private  String mode =  null ;  30.   31.     public   void  setMode(String mode) {  32.         if  (mode ==  null  || MOST_WORDS_MODE.equalsIgnoreCase(mode) ||  "default" .equalsIgnoreCase(mode)) {  33.             this .mode = MOST_WORDS_MODE;  34.         } else   if  (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {  35.             this .mode = MAX_WORD_LENGTH_MODE;  36.         } else  {  37.             throw   new  IllegalArgumentException( "不合法的分析器Mode参数设置:"  + mode);  38.         }  39.     }  40.   41.     @Override   42.     public   void  init(Map<String, String> args) {  43.         super .init(args);  44.         setMode(args.get("mode" ));  45.     }  46.   47.     public  Tokenizer create(Reader input) {  48.         return   new  PaodingTokenizer2(input, PaodingMaker.make(), createTokenCollector());  49.     }  50.   51.     private  TokenCollector createTokenCollector() {  52.         if  (MOST_WORDS_MODE.equals(mode))  53.             return   new  MostWordsTokenCollector();  54.         if  (MAX_WORD_LENGTH_MODE.equals(mode))  55.             return   new  MaxWordLengthTokenCollector();  56.         throw   new  Error( "never happened" );  57.     }  58. }  Java代码  收藏代码1. package net.paoding.analysis.analyzer;  2.   3. import java.io.Reader;  4. import java.util.Map;  5.   6. import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;  7. import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;  8. import net.paoding.analysis.knife.PaodingMaker;  9.   10. import org.apache.lucene.analysis.Tokenizer;  11. import org.apache.solr.analysis.BaseTokenizerFactory;  12.   13. /** 14.  * Created by IntelliJ IDEA.  15.  * User: ronghao  16.  * Date: 2007-11-3  17.  * Time: 14:40:59 中文切词 对庖丁切词的封装 18.  */  19. public class ChineseTokenizerFactory extends BaseTokenizerFactory {  20.     /** 21.      * 最多切分 默认模式 22.      */  23.     public static final String MOST_WORDS_MODE = "most-words";  24.     /** 25.      * 按最大切分 26.      */  27.     public static final String MAX_WORD_LENGTH_MODE = "max-word-length";  28.   29.     private String mode = null;  30.   31.     public void setMode(String mode) {  32.         if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) {  33.             this.mode = MOST_WORDS_MODE;  34.         } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {  35.             this.mode = MAX_WORD_LENGTH_MODE;  36.         } else {  37.             throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);  38.         }  39.     }  40.   41.     @Override  42.     public void init(Map<String, String> args) {  43.         super.init(args);  44.         setMode(args.get("mode"));  45.     }  46.   47.     public Tokenizer create(Reader input) {  48.         return new PaodingTokenizer(input, PaodingMaker.make(), this.createTokenCollector());  49.     }  50.   51.     private TokenCollector createTokenCollector() {  52.         if (MOST_WORDS_MODE.equals(mode))  53.             return new MostWordsTokenCollector();  54.         if (MAX_WORD_LENGTH_MODE.equals(mode))  55.             return new MaxWordLengthTokenCollector();  56.         throw new Error("never happened");  57.     }  58. }   
  

  这两个修改的类就放在/opt/tomcat/webapps/solr中,在压缩包的WEB-INF文件夹中新建classes文件夹,将这两个类连同包层次复制进去就行。
  6.设置PAODING_DIC_HOME的环境变量,指向Paoding词典文件的位置。(比如/opt/dic)
  #vim /etc/profile
  添加下面的环境变量
  JAVA_HOME=/usr/lib/jvm/java-6-openjdk
CLASSPATH=.:/usr/lib/jvm/java-6-openjdk/lib
ANT_HOME=/usr/share/ant
PATH="$JAVA_HOME/lib:$ANT_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
PAODING_DIC_HOME=/opt/dic
export JAVA_HOME
export CLASSPATH
export ANT_HOME
export PATH
export PAODING_DIC_HOME
  7. 将Paoding和数据库驱动放到/opt/tomcat/webapps/solr/WEB-INF/lib中。
  进入浏览器,运行
    http://localhost:8983/solr/dataimport?command=full-import
    导入成功后,运行
    http://localhost:8983/solr/admin/
    在搜索框中输入搜索内容进行查询
  现在就完成了数据库的索引了。
  


             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138218-1-1.html 上篇帖子: Solr的自动完成/自动补充实现介绍(1): autoComplete 下篇帖子: SOLR 5.0安装 使用内置脚本安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表