Solr与Mysql集成指南

Solr与Mysql集成指南

    在《企业级搜索引擎Solr使用入门指南》《企业级搜索引擎Solr交流》中对Solr的使用做了简单介绍。在数据库驱动的应用中,当时采用的方案是应用层面有数据的增删改操作时候,由应用通过调用solr的xml接口来完成solr索引的增删改操作,对批量操作采用提交csv报文的方案。但此种方案不足之处在于:需要应用在增删改业务逻辑中来调用solr接口,业务逻辑与搜索引擎建索引的逻辑混在一起,在需要对搜索引擎的策略进行调整,可能需要对每一次业务应用涉及搜索的逻辑进行修改。在处理批量导入、增量操作时候也很不方便。

    从Solr 1.3开始,Solr提供DataImportHandler工具完成对mysql数据库数据的操作。因此极大方便了Solr与Mysql的集成,因此可以借助DataImportHandler来完成Solr与Mysql的集成,基本思路如下:

      1、使用mysql的触发器trigger获取数据库表数据的增删改操作

      2、触发器通过mysql的用户自定义函数user-defined function (UDF) 包mysql-udf-http 调用Solr DataImportHandler对应的命令

      3、由Solr DataImportHandler完成增删改数据的索引操作。

    此种方案的优点在于将索引逻辑完全与应用的业务逻辑处理完全隔离,尤其是对批量导入、增量导入有其优势。

    下面简单介绍Solr与Mysql集成的方案。关于solr的配置及使用说明可参考《企业级搜索引擎Solr使用入门指南》《企业级搜索引擎Solr交流》 ,这里主要说明与DataImportHandler相关的安装使用。

    测试环境说明:  

   操作系统:CentOS 5

   数据库:Mysql 5 ,直接使用了rpm安装的,mysql的lib库安装在/usr/lib/mysql

  Tomcat 6:tomcat安装在/opt/tomcat

  JDK 6

一、Solr安装配置

1)、Solr的安装

wget http://www.apache.org/dist//lucene/solr/3.4.0/apache-solr-3.4.0.tgz

tar zxvf apache-solr-3.4.0.tgz

cd apache-solr-3.4.0

cp -r example/webapps/solr.war /opt/tomcat/webapps/

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

cp -r dist/  /opt/solr-tomcat/

注dist目录下中有使用dataimport所必须的jar包apache-solr-dataimporthandler

将mysql的JDBC Driver mysql-connector-java-5.1.17-bin.jar拷贝到/opt/solr-tomcat/lib/下

 设定solr.solr.home

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

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

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

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

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

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

    </Context>

注:

   为了避免在Solr管理界面测试时候出现中文乱码问题,需要做如下设置:

   /opt/tomcat/conf/server.xml 中设定URIEncoding: 

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

   /opt/tomcat/webapps/solr/WEB-INF/web.xml 设定过滤器

<filter> 
    <filter-name>Set Character Encoding</filter-name> 
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> 
    <init-param> 
        <param-name>encoding</param-name> 
        <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
        <param-name>ignore</param-name> 
        <param-value>true</param-value> 
    </init-param> 
</filter>

<filter-mapping> 
    <filter-name>Set Character Encoding</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>

在xml请求数据中增加编码说明:

<?xml version=’1.0′ encoding=’utf-8′?>

<add>

<doc>

  <field name="id">123</field>

  <field name="name">Solr企业级搜索</field>

  <field name="manu">Apache Software Foundation</field>

  <field name="liangchuan">liangchuan’s solr "hello,world" test</field>

  <field name="url">http://www.google.com</field>

</doc>

</add>

 

3)、配置solr

cd /opt/solr-tomcat/

vi solrconfig.xml ,增加如下内容

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> 
  <lst name="defaults"> 
    <str name="config">/opt/solr-tomcat/conf/data-config.xml</str> 
    <lst name="datasource"> 
       <str name="driver">com.mysql.jdbc.Driver</str> 
       <str name="url">

         jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf-8

       </str> 
       <str name="user">user</str> 
       <str name="password">password</str> 
    </lst> 
  </lst> 
</requestHandler>

<lib dir="/opt/solr-tomcat/lib" /> 
<lib dir="/opt/solr-tomcat/dist" />

这里的data-config.xml就是DataImportHand
ler的配置文件

vi  /opt/solr-tomcat/conf/data-config.xml,内容如下:

<dataConfig> 
  <document name="documents1"> 
        <entity name="documents"

          query="select id,title,content,date_added from documents" 
          deltaImportQuery="select  id,title,content,date_added  from documents where ID=’${dataimporter.delta.id}’" 
          deltaQuery="select id  from documents where date_added &gt; ‘${dataimporter.last_index_time}’" 
        > 
            <field column="id" name="id" /> 
            <field column="title" name="title" /> 
            <field column="content" name="content" /> 
            <field column="date_added" name="date_added" /> 
        </entity> 
    </document> 
</dataConfig>

关于DataImportHandler的详细使用请参考:http://wiki.apache.org/solr/DataImportHandler

这里就常用的用法简单说明:

query语句是用于批量导入(Full Import)中获取符合条件的全部数据的SQL。

deltaQuery语句是用于增量导入(Delta Import)中获取符合增量导入标准的数据的主键的SQL,供deltaImportQuery查询使用。

deltaImportQuery语句增量导入(Delta Import)中获取需要增量索引数据(document)的字段(field)

DataImportHandler的常见命令:

    批量导入(full-import):

        http://<host>:<port>/solr/dataimport?command=full-import&commit=y 
    增量导入(delta-import):

        http://<host>:<port>/solr/dataimport?command=delta-import&commit=y 
    导入状态查询(status):

        http://<host>:<port>/solr/dataimport 
    重新装载配置文件(reload-config):

        http://<host>:<port>/solr/dataimport?command=reload-config 
    终止导入(abort):

        http://<host>:<port>/solr/dataimport?command=abort

Solr执行增量导入的大致原理

    1、Solr 读取conf/dataimport.properties 文件,得到solr最后一次执行索引操作的时间戳last_index_time,以及单个实体最后一次执行索引的时间戳:entity_name.last_index_time

    2、Solr对指定的实体使用deltaImportQuery SQL查询得到insert或update时间戳大于${dataimporter.last_index_time}需要增量索引的字段,然后调用deltaQuery对符合条件需要执行增量索引的文档的字段进行索引,并更新dataimport.properties 的时间戳

 

数据库的测试表结构如下:

DROP TABLE IF EXISTS `documents`; 
CREATE TABLE `documents` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `date_added` datetime NOT NULL, 
  `title` varchar(255) NOT NULL, 
  `content` text NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

4)、测试Solr配置

  在数据库中documents表中插入几条数据,然后

执行批量导入操作:

:/solr/dataimport?command=full-import&commit=y">:/solr/dataimport?command=full-import&commit=y">http://<host>:<port>/solr/dataimport?command=full-import&commit=y

执行增量导入操作: 
:/solr/dataimport?command=delta-import&commit=y">:/solr/dataimport?command=delta-import&commit=y">http://<host>:<port>/solr/dataimport?command=delta-import&commit=y

:/solr/admin">:/solr/admin">http://<host>:<port>/solr/admin执行查询操作,测试配置是否正确

 

 

二、mysql-udf-http 安装配置

wget http://mysql-udf-http.googlecode.com/files/mysql-udf-http-1.0.tar.gz

tar zxvf mysql-udf-http-1.0.tar.gz

cd mysql-udf-http-1.0/

./configure –prefix=/usr –with-mysql=/usr/bin/mysql_config

make && make install

echo "/usr/lib/mysql/plugin" >> /etc/ld.so.conf.d/mysql-i386.conf

/sbin/ldconfig

/sbin/ldconfig -v|grep mysql

  如果没有类似如下的输出

   /usr/lib/mysql/plugin: 
        mysql-udf-http.so.0 -> mysql-udf-http.so 
   则建立mysql-udf-http.so 的软连接(当然也可以通过修改编译Makefile脚本)

ln -s /usr/lib/mysql/plugin/mysql-udf-http.so /usr/lib/mysql/plugin/libmysql-udf-http.so

  建立软连接后再执ldconfig 命令,使用/sbin/ldconfig -v|grep mysql是否有如下内容:

/usr/lib/mysql/plugin: 
        mysql-udf-http.so.0 -> libmysql-udf-http.so 
原因是mysql-udf-http的Makefile中指定了动态链接库的SONAME为mysql-udf-http.so.0 ,而ldconfig缺省只处理以lib开头的动态链接库(例如libmysqlclient.so.15),因此执行ldconfig命令时候忽略了mysql-udf-http.so 。

创建mysql的用户自定义函数:

mysql >

create function http_get returns string soname ‘libmysql-udf-http.so’; 
create function http_post returns string soname ‘libmysql-udf-http.so’; 
create function http_put returns string soname ‘libmysql-udf-http.so’; 
create function http_delete returns string soname ‘libmysql-udf-http.so’;

三、创建调用mysql-udf-http的触发器

/* INSERT插入操作的触发器 */ 
DELIMITER | 
DROP TRIGGER IF EXISTS documents_insert; 
CREATE TRIGGER documents_insert 
AFTER INSERT ON documents 
FOR EACH ROW BEGIN 
     SET @result = (SELECT http_get(‘http://www.yeeach.com/solr/dataimport?command=delta-import&commit=yes’)); 
END | 
DELIMITER ;

/* UPDATE更新操作的触发器 */ 
DELIMITER | 
DROP TRIGGER IF EXISTS documents_update; 
CREATE TRIGGER documents_update 
AFTER UPDATE ON documents 
FOR EACH ROW BEGIN 

60;    SET @result = (SELECT http_get("http://www.yeeach.com/solr/dataimport?command=delta-import&commit=yes")); 
END | 
DELIMITER ;

/* DELETE删除操作的触发器 */ 
DELIMITER | 
DROP TRIGGER IF EXISTS documents_delete; 
CREATE TRIGGER documents_delete 
AFTER DELETE ON documents 
FOR EACH ROW BEGIN 
        SET @result = (SELECT http_get(CONCAT(‘http://www.yeeach.com/solr/update/?stream.body=<delete><id>’,OLD.id,’</id></delete>&stream.contentType=text/xml;charset=utf-8&commit=true’))); 
END | 
DELIMITER ;

四、测试

  在数据库执行增删改操作,然后在Solr的管理界面执行查询操作,测试触发器调用mysql-udf-http是否正常。

五、参考资料

DataImportHandler文档:http://wiki.apache.org/solr/DataImportHandler

Mysql UDF的大本营:http://www.mysqludf.org/

mysql-udf-http:http://code.google.com/p/mysql-udf-http/

 


转自:http://www.cnblogs.com/wuruile/articles/3383811
2019-03-27 01:02

知识点

相关教程

更多

Solr与Mysql集成指南

在《企业级搜索引擎Solr使用入门指南》及《企业级搜索引擎Solr交流》中对Solr的使用做了简单介绍。在数据库驱动的应用中,当时采用的方案是应用层面有数据的增删改操作时候,由应用通过调用solr的xml接口来完成solr索引的增删改操作,对批量操作采用提交csv报文的方案。但此种方案不足之处在于:需要应用在增删改业务逻辑中来调用solr接口,业务逻辑与搜索引擎建索引的逻辑混在一起,在需要对搜索引

nutch,solr集成在hadoop上

nutch,solr集成在hadoop上 nutch是一个应用程序,在我的这个项目里主要是做爬虫用,爬取后的内容寄存在hdfs上,所以在hdfs结合模块现已结合上去了。 solr: 在eclipse新建动态页面项目,删去WebContent的一切内容。  在solr/dist下(或许/solr3.6.2/example/webapps下)解压solr.war 将一切内容拷贝到WenContent里

集成Nutch和Solr

两年前集成Nutch 和Solr 这两个Apache Lucene 项目组下的子项目实在是件困难的事情,需要打很多补丁(patches),为他们的联姻搜寻各种必需的组件(required components)。今非昔比,时下,在Solr4.0 也即将浮出水面的时候,两者的结合变的相对容易。 今年早些时候发布的Nutch 1.0包含了"开盒即用"的原装的(out of the

Solr安装及集成javaWeb

1.下载solr-4.7.1 http://www.apache.org/dyn/closer.cgi/lucene/solr/4.7.1 环境需求:java 1.6版本以上;solr运行需要java serverlet 容器,默认使用jetty,或者tomcat,jboss等等。 2.Tomcat部署solr: 1. 安装好jdk 1.6以上(我用是jdk1.7.0_15),安装好tomcat(

Solr使用入门指南

本文转自 http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!499.entry?wa=wsignin1.0 由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 1. 基于Lucene自己进行封装实现站内搜索。工作量及扩展性都较大,不采

Solr使用入门指南

本文转自 http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!499.entry?wa=wsignin1.0 因为搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量须要搜索引擎的功能需求,眼下在实现搜索引擎的方案上有集中方案可供选择: 1. 基于Lucene自己进行封装实现站内搜索。工作量及扩展性都较大,不採

Solr使用入门指南

由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 1. 基于Lucene自己进行封装实现站内搜索。工作量及扩展性都较大,不采用。 2. 调用Google、Baidu的API实现站内搜索。同第三方搜索引擎绑定太死,无法满足后期业务扩展需要,暂时不采用。 3. 基于Compass+Lucene实现站内搜索。适合于

[Solr] (源) Solr与MongoDB集成,实时增量索引

一. 概述   大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务。   另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml、json等形式的内容,使得对数据的使用更灵活。   对于MongoDB与Solr的描述不在这里阐释了,本文旨在给大家提供整个Solr与MongoDB接合的方法,实现实时的增量索引。   Mongo

solr 3.6.0 安装及简单配置指南

前言   项目中用到lucene进行全文检索,目前被索引的文档数超过1亿,索引文件占用磁盘空间接近400G。目前尚没有一个完善的索引分布式部署和备份的解决方案。 考虑到solr具备类似于mysql主从复制的机制,因此决定试用一下。   安装   到apache官网找到最新版本的solr稳定版,目前是3.6.0,就近到一个镜像网站下载,我选取的站点是: http://labs.mop.com/apa

OpenCms 集成外部Solr Server

OpenCms默认是以内嵌的Solr作为全文搜索服务的,不过我们也可以配置一个独立的Solr搜索服务器 设置外部Solr Server  1. 从Solr 官方站点http://lucene.apache.org/solr/downloads.html下载solr最新版,目前是4.2.1版本,解开压缩包solr-4.2.1.zip, 解压缩文件至solr-4.2.1目录中 2. 创建一目录取名为S

solr在tomcat下集成mmseg

mmseg最新版本为1.9.1 http://code.google.com/p/mmseg4j/, 最高仅支持solr4.5.1 所以这里solr用的是4.5.1版本(已经出到4.6.0版本了)http://archive.apache.org/dist/lucene/solr/4.5.1/  tomcat使用的是6版本(懒得下7,所以直接用6好了),下面开始整合: 1、下载solr后解压,并将

集成 SOLR 到 TOMCAT 中(傻瓜教程)

按照如下配置,整个 Solr 是绿色版的,可以将 Tomcat 目录复制到任何一个地方运行 1、下载 solr 4.3 版本 2、下载 Tomcat 7 ( 6 也可以),另外可以根据系统下载 32 位或者64位版本 3、下载 jre ,可以在 oracle 网站下载 4、解压 Tomcat 到一个目录,例如 F:\Apache\Tomcat 5、将 jre 安装到 Tomcat\jre 目录中(

Nutch和Solr的集成方案

本方案中,Solr作为处理搜索结果的源和入口,有效的减轻对Nutch的搜索负担,让Nutch负责她最擅长的工作:抓取(crawling)和提取(extracting)内容。使用Solr作为搜索后端,换句话说,就是允许使用所有SolrServer的高级特性,诸如:查询拼写检查(spell-check),搜索提醒(suggestion),数据复制(data-replication),查询缓存等等。 N

荐 APDPlat拓展搜索之集成Solr

APDPlat充分利用Compass的OSEM和ORMintegration特性,提供了简单易用且功能强大的内置搜索特性。 APDPlat的内置搜索,在设计简洁优雅的同时,还具备了强大的实时搜索能力,用户只需用注解的方式在模型中指定需要搜索哪些字段(还可在模型之间进行关联搜索)就获得了搜索能力,而不用编写任何代码。平台自动处理索引维护、查询解析、结果高亮等支撑功能。 然而APDPlat的内置搜索只

Nutch集成Solr中文分词Schema

<?xml version="1.0" encoding="UTF-8" ?>   <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor     license agreements. See the NOTICE file d

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案