日期:2014-05-16  浏览次数:20572 次

使用lucene solr搭建Oracle数据库全文搜索服务

最近在做地名搜索定位的项目,相当于对经过地理编码的数据进行搜索

主要是将数据库中的数据导入到solr中并发布出来,数据量目前是1500万条左右

记录一下大概的工作步骤

1 基本部署
目前solr最高版本为4.0
由于项目服务器使用JDK1.5, 在本例中使用3.6.1版本, 服务器使用TomCat 及Weblogic
下载并解压apache-solr-3.6.1.zip,
将文件dist\apache-solr-3.6.1.war改为zip后缀并解压
解压出来的文件放到 tomcat\webapps\solr\
注意:如果要部署到weblogic中,建议先修改apache-solr-3.6.1.zip中的META-INF\MANIFEST.MF中的
Implementation-Version值,去掉其中的冒号,以免weblogic自动识别版本号时出现非法字符导致部署失败
新建一个文件夹目录,以保存solr索引文件,比如:D:\Solr_Home\solr
在此目录下新建两个目录,lib, cores
将apache-solr-3.6.1.zip中的dist文件夹下所有文件及文件夹复制到lib目录下
将apache-solr-3.6.1.zip中的示例项目文件夹example\example-DIH\solr\db复制到cores目录下
打开db\conf\solrconfig.xml,找到apache-solr-dataimporthandler的lib配置段
修改其lib位置如下:

    <lib dir="../../lib/" regex="apache-solr-dataimporthandler-.*\.jar" />

将example\example-DIH\solr\solr.xml复制到D:\Solr_Home\solr目录下


修改solr.xml,将cores段修改为如下文本:
  <cores adminPath="/admin/cores">    
	<core instanceDir="/cores/db" name="db"/>
  </cores>

用编辑器打开tomcat\webapps\solr\WEB-INF\web.xml
将env-entry段取消注释
修改其中的env-entry-value值为D:\Solr_Home\solr
(此即为solr自带样例)
如下:
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>E:/solr_home/solr</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

启动tomcat,然后打开localhost:8080/solr/ 此时,能成功看到Welcome to Solr的页面,
点击Admin db 进入管理界面,可进行查询等操作


2 数据导入 索引建立
将数据库的表数据导入到solr中做查询,例如使用Oracle数据库,
表名为Address
有三列
name,x,y
可以通过select name,x,y from Address进行查询


打开db\conf\db-data-config.xml
修改dataSource段和document段如下:
<dataConfig>
    <dataSource driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:testoracle" user="test" password="test" batch-size="-1"/>


    <document>
           <entity name="user" query="select name,x,y from Address">
              <field column="x" name="x" />
              <field column="name" name="name" />    
                <field name="y" column="y" />
           </entity>	   
    </document>	
</dataConfig>

其中entity相当于一条记录,field相当于记录的字段,与表内数据对应
batch-size是多少条记录提交一次,根据索引的大小,一般设置1000以内


打开conf\schema.xml文件
查找所有field段并注释掉
然后添加如下记录:
   <field name="name" type="text" indexed="true" stored="true"/>
   <field name="x" type="string" indexed="true" stored="true"/>
   <field name="y"  type="string" indexed="true" stored="true"/>

修改uniqueKey及defaultSearchField,如下
 <uniqueKey>name</uniqueKey> 
 <defaultSearchField>name</defaultSearchField>

将oracle的jdbc驱动包, ojdbc14.jar 复制到 D:\Solr_Home\solr\db\lib\ 目录下
 
重启tomcat,打开localhost:8080/solr/db/dataimport?command=full-import
不出意外的话,数据会很快导入到solr中,如果数据量比较大,

可通过地址查看导入过程:

localhost:8080/solr/db/dataimport


导入完成后可打开localhost:8080/solr/db/admin,在此页面中进行查询
注意,若查询中文,可能会遇到乱码或无法查询的情况,
对于tomcat需要修改tomcat\conf\server.xml中的connector段
加入URIEncoding="UTF-8",如下:

      <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8" /