Solr05-Solr在实际开发中的应用

Posted shoufeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr05-Solr在实际开发中的应用相关的知识,希望对你有一定的参考价值。

目录

1 配置中文分词器

1.1 准备IK中文分词器

  1. 复制IK解压目录中的jar包: IKAnalyzer2012FF_u1.jar. 可在 我的github 下载.

  2. 粘贴到tomcat/webapps/solr/WEB-INF/lib目录.

  3. 复制IK解压目录中的配置文件:
    技术分享图片

  4. 粘贴到tomcat/webapps/solr/WEB-INF/classes目录.

1.2 配置schema.xml文件

1.2.1 加入使用IK分词器的域类型

<!--加入使用ik分词器的域类型-->
<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>

1.2.2 加入使用IK分词器的域

<!--加入使用ik分词器的域-->
<field name="content_ik" type="text_ik" 
       indexed="false" stored="true" multiValued="true"/>

技术分享图片

1.3 重启Tomcat并测试

选择任意Core, 然后在菜单栏里选择[Analysis], 输入中文语句, 进行分词测试:
技术分享图片

2 配置业务域

需求引入: 假设现在要使用Solr完成电商网站商品数据的搜索, 需要将保存在关系数据库中的商品数据导入到Solr索引库中.

2.1 准备商品数据

DROP DATABASE IF EXISTS `solr`;
CREATE DATABASE `solr`;
USE `solr`;

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
    `pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品编号',
    `name` varchar(255) DEFAULT NULL COMMENT '商品名称',
    `catalog` int(11) DEFAULT NULL COMMENT '商品分类ID',
    `catalog_name` varchar(50) DEFAULT NULL COMMENT '商品分类名称',
    `price` double DEFAULT NULL COMMENT '价格',
    `number` int(11) DEFAULT NULL COMMENT '数量',
    `description` longtext COMMENT '商品描述',
    `picture` varchar(255) DEFAULT NULL COMMENT '图片名称',
    `release_time` datetime DEFAULT NULL COMMENT '上架时间',
    PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=6126 DEFAULT CHARSET=utf8;

具体表数据可在 我的github 下载.

2.2 配置商品业务域

说明: 分析商品数据库表, 确定哪些字段需要在Solr中建立索引和存储.

字段: pid, name, catalog, catalog_name, price, description, picture

  • 商品Id(直接使用Solr的id域):
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="true"/> 
  • 商品名称(若要用于高亮显示, 必须设置stored="true"):
<field name="product_name" type="text_ik" indexed="true" stored="true" /> 
  • 商品分类id:
<field name="product_catalog" type="int" indexed="true" stored="true" /> 
  • 商品分类名称(String类型, 表示整体匹配, 不作分词):
<field name="product_catalog_name" type="string" indexed="true" stored="true" /> 
  • 商品价格:
<field name="product_price" type="double" indexed="true" stored="true" /> 
  • 商品描述:
<field name="product_description" type="text_ik" indexed="true" stored="false" /> 
  • 商品图片:
<field name="product_picture" type="string" indexed="false" stored="true" /> 
  • 配置商品复制域(stored="true", 实际开发中multiValued="true"的field不需要存储, 这里存储便于观察效果):
<!-- 加入商品搜索复制域, 即将商品名、商品类型和描述都作为搜索关键词提供搜索 -->
<field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/> 
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_catalog_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>

2.3 配置schema.xml文件

注意: 这里id使用Solr默认的id域(一定要有主键, 没有则需要将默认的id域删除, 也可更改id生成策略. 尝试过未在库中设置主键而此文件中的id域未删除也未重写, 此时可以建立索引, 却无法检索到结果(⊙﹏⊙)):

技术分享图片

2.4 重新启动Tomcat并查看配置

选中任意一个core, 选择Analysis, 在Fieldname / FieldType处查看, 观察配置是否成功:
技术分享图片

3 配置数据导入处理器 -- DIH

3.1 加入数据导入处理器的jar包

复制Solr解压后dist目录中的: solr-dataimporthandler-4.10.4.jar;

粘贴到contrib/dataimporthandler/lib(lib文件夹需要手动创建):

技术分享图片

3.2 加入数据库驱动包

复制所用数据库服务器的相应jar包;

粘贴到contrib/db/lib(db/lib需要手动创建):
技术分享图片

注意: 这里使用的mysql服务器版本为5.7.20, 故导入5.1.44版本的jar包 -- 其他较低版本的jar包可能会出现一些不可预知的Bug.

3.3 配置solrconfig.xml文件

在SolrCore(即collection1)中找到solrconfig.xml文件.

3.3.1 配置lib标签 --- 加入数据库驱动&数据导入jar包

<!-- 配置加入数据导入、数据库驱动的jar包 -->
<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*.jar"/>
<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*.jar"/>

3.3.2 配置requestHandler标签 -- 加入数据导入处理器

Solr的数据索引分两种: 全量导入(full-import)和增量导入(delta-import), 顾名思义, 全量导入就是一次性全部导入所有数据, 而增量导入就是当数据库中的数据有更新时再作导入处理.

使用dataimport就需要在solrconfig.xml中添加DIH配置信息:

<!-- 加入数据导入的请求处理器 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

3.3.3 在conf目录下创建data-config.xml

注意: 这里field的column属性是对应数据库中的字段, 而name属性的值必须与scheme.xml中新配置的field的name属性的值一致, 否则无法解析.

<?xml version="1.0" encoding="UTF-8" ?> 
<dataConfig>
    <!-- 数据源配置 -->
    <dataSource type="JdbcDataSource" 
            driver="com.mysql.jdbc.Driver" 
            url="jdbc:mysql://127.0.0.1:3306/solr?useSSL=true" 
            user="ur_login_name" 
            password="ur_pwd"/> 
    <document>
         <!-- 配置sql语句执行结果, 与商品业务域的对应关系 -->
         <entity name="product" pk="pid"
                 query="SELECT pid, name, catalog, catalog_name, price, description, picture 
                        FROM products">
             <field column="pid" name="id"/> 
             <field column="name" name="product_name"/> 
             <field column="catalog" name="product_catalog"/>
             <field column="catalog_name" name="product_catalog_name"/> 
             <field column="price" name="product_price"/> 
             <field column="description" name="product_description"/>
             <field column="picture" name="product_picture"/>
         </entity>
    </document> 
</dataConfig>

参数说明:

  • dataSource: 定义了数据的位置, 对于数据库, 则是DSN(Data Source Name, 即数据源名称, 数据库服务器的主机名、端口和数据库名、用户、密码); 对于HTTP数据源, 则是基本的URL.
  • entity: 实体会被处理生成包含多个字段的文档的集合, 会被发送给Solr进行索引. 对于RDBMS数据源, 一个实体是一个视图或表, 可能被一至多个SQL语句处理来生成一系列具有一或多个列(字段)的行(文档).
  • processor: 一个实体处理器会完成整个从数据源抽取内容、转换并将其添加到索引的工作, 可用自定义实体处理器扩展或替换默认提供的处理器.
  • transformer: 从实体中取得的每个字段的集都可以选择进行转换, 此过程可修改字段、创建新字段或从单个行生成多个行. 可通过公用接口自定义转换器.
  • 其他配置用法说明:
<entity name="product" pk="pid"
        query="SELECT * FROM products"
        deltaImportQuery="SELECT * FROM products where pid='${dih.delta.id}'"
        deltaQuery="SELECT pid FROM products where last_modified > '${dih.last_index_time}'" >
    <field /> 
    <!-- ...... -->
</entity>
  • pk代表主键, query是在full-import模式下使用的查询, deltaImportQuery和deltaQuery -- delta-import专用: 首先数据库中要有一个类型为timestamp的类似于last_modified的时间字段, 当执行dataimport时, Solr会在conf目录下自动生成dataimport.properties文件以记录最后一次导入的时间, 当要执行delta-import时首先执行deltaQuery查出有改变的数据的id, 然后通过id来执行deltaImportQuery以增量导入数据.
  • 值得一提的是, Solr5之后使用${dih.delta.id}来获取需要增量导入的数据的主键(之前使用的是${dataimporter.delta.ID}), 使用${dih.last_index_time}来获取dataimport.properties文件中last_index_time的属性值(之前使用的是${dataimporter.last_index_time}).

3.4 重启Tomcat并查看DIH的配置

重启Tomcat, 在菜单栏的[Dataimport]查看配置的Entity是否生效. 也可通过菜单栏的[Files]查看配置文件.
技术分享图片

3.5 执行导入

  • 通过Solr管理界面的Dataimport方式导入:
    技术分享图片

    注意: 由于Solr管理界面的不稳定性, 索引状态的显示可能会消失, 可通过查看Dashboard中JVM-Memory的波动程度, 确定是否处于索引状态.

  • 也可通过HTTP请求的方式导入, HTTP请求URL格式为:

http://ip:port/[web-dir]/CoreName/dataimport?command=command[&params], 其中参数params有:

参数 描述
clean 默认为true, 表示是否在建立下一次索引前清除原有索引(慎用)
commit 默认为true, 表示是否在操作完成后提交
debug 默认为false, 表示是否以Debug模式运行. 此默认的commit默认为false.
entity 用已指定操作的entity, 只能指定DIH配置文件中内首层元素的name, 若传递空值, 则对所有entity执行操作.
optimize 默认为true, 表示在操作之后是否optimize(优化索引).

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但未经博主同意必须保留此段声明, 且在文章页面明显位置给出原文链接, 否则博主保留追究法律责任的权利.

以上是关于Solr05-Solr在实际开发中的应用的主要内容,如果未能解决你的问题,请参考以下文章

solr 学习片段

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

在 solr 3.4 中放置突出显示片段配置的位置

运行/调试你的PHP代码

超实用的php代码片段

02 Apache Solr: 概览 Solr在信息系统架构中的位置