FlymeTV 全局搜索实践
solr 环境搭建
solr 版本选择
截至本文编写,Apache Solr 最新版本已经是 6.1.0,要求 JRE 1.8+,如下图
为此只能使用 Apache Solr 5.0+ 版本,浏览 solr 下载目录,当前最新的 5.0+ 版本为 5.5.2
下载安装
创建 core
solr 的 core,类似 mysql 的数据库,对于 FlymeTV 的全局搜索业务,我们建一个名为 tv 的 core,如下
配置
core tv 创建好以后,solr 会自动创建其目录,本文例子该目录位于 /data/solr/server/solr/tv,进入目录后有2个子目录
conf:配置目录
data:数据目录
进入配置目录,看下有哪些文件
修改 solrconfig.xml
schema.xml 是 solr 的字段定义文件,灰常之重要
默认情况下,solr 管理 schema.xml,不允许手动修改。为了能自定义 schema.xml,需要先对 solrconfig.xml 进行修改:这是通过<schemaFactory/>来指定的,只需要启用ClassicIndexSchemaFactory,并停用ManagedIndexSchemaFactory即可
找到 solrconfig.xml 中的 AddSchemaFieldsUpdateProcessorFactory元素,将其注释:这样就无需在 schema.xml 里定义 booleans 等字段类型,且可以避免程序抛出 “This IndexSchema is not mutable” 异常
找到 solrconfig.xml 里的 <initParams> 元素,如下,将_text_ 修改为 tvinfo:这里定义的是更新,查询等操作的默认字段,修改为 tvinfo,这个字段将在 schema.xml 里定义。
这个修改不是必须的,如果这里不做修改的话,需要在 schema.xml 里定义 _text_ 字段,否则保存数据到 solr 会出错
自定义 schema
启用中文分词
中文分词采用 IK Analyzer,不过这个版本的 ik analyzer 只能用于 solr 4.x,如果要在 solr 5.x 使用,需要使用 ik analyzer solr5,我们需要把源码 clone 到本地编译打包,生成 Ik-analyzer-solr5-5.x.zip
下载该文件到 solr 的dist目录下,解压缩后得到 ik-analyzer-solr5-5.x.jar,然后修改 solrconfig.xml 文件来引入该分词库
验证安装
core
通过浏览器打开 solr 后台页面来验证,访问地址为 http://ip:8983/solr
能选择 tv 这个 core,表明配置正常,core 成功被实例化
中文分词
选择 Analysis 页面,Field Value (Index) 输入 “刘德华周星驰吴彦祖”,Analyse Fieldname / FieldType 选择 tvinfo,点击 Analyse Values
分词结果正常,再试一下“中国香港台湾”
应该说这个分词质量还是挺不错的
拼音分词
为了加速拼音查询,使用 Edge N-Gram 过滤器对拼音进行了分词,看下效果,我们输入fczlm(复仇者联盟)
可见,分词很成功
DIH 导入数据
Data Import Handler 是 solr 提供的一个数据导入工具,可以通过简单配置来实现从关系型数据库向 solr 同步数据。这里就尝试一下用 DIH 来把 MEIZU_TVVIDEO 数据库的 T_SH_ALBUM(搜狐视频信息)导入 solr 的 core tv
加载 mysql 驱动
要从 mysql 导数据,solr 需要 mysql 的驱动,先将驱动下载到 /data/solr/dist 目录 :注意:使用5.x 的驱动,6.x 的驱动貌似不能正常加载
然后修改solrconfig.xml,添加如下的配置
DIH 配置
DIH 需要配置文件来指定从何处、如何导入数据,在 conf 目录下创建一个 dih-config.xml 的文件,内容如下
注意
DIH 支持全量导入和增量导入,这里仅使用了全量导入
sql 字段 和 solr 字段必须声明映射关系,即使字段名一样
<,> 需要转义
多数据源 DIH
说明
可以定义多个数据源,每个数据源有一个唯一的名称,在 entity 的属性里指定数据源
22,23 行表示该字段值为一个常数,需要
TemplateTransformer
注册 DIH
配置好 DIH 以后,修改 solrconfig.xml 以注册,只需添加如下的配置即可
验证
全部配置好以后,重启 solr,然后进入 admin 界面验证 DIH,如下图
在 core tv 下,选择 Dataimport,点击 【execute】即可导入数据
注意:勾选 Clean 会将已存在的文档删除
Srping Data Solr
使用 spring data solr,在 java 程序里操作 solr,git 仓库地址 /meizu/server/tv-commons
maven
spring 配置
代码
只需要继承 SolrCrudRepository 这个接口,spring data solr 将会自动实现对 solr 进行 CRUD 的操作
分组查询
全局搜索需要实现分组查询,即视频,应用,游戏分 3 组,一个查询语句返回 3 组匹配搜索条件的查询。这种需求关系型数据库很难实现,但对于 solr 来说就是小菜一碟了,因为 solr 有强大的 group
group 参数
group 的参数很多,这里只介绍重要的几个
参数
类型
说明
group
boolean
是否开启 group 查询
group.field
string
分组字段
group.query
query
该查询返回一组匹配的文档
group.limit
int
每组返回多少结果,默认=1
group.offset
int
针对每组里的文档集合,指定一个初始的偏移量
group.filed
group.field 必须满足如下条件
单值(single-valued)
索引(indexed)或 docValues=true
string 类型,如 StrField 或 TextField(貌似 int 也可以)
group.query
不指定分组字段,而是指定分组条件,例如将查询结果按价格区间分组
price<100
price<=500 and price>=100
price>500
那么查询可以这么写
TODO LIST
solr 高可用
cloud 模式
主从复制
查询结果排序
匹配度
热度,热度由业务决定
搜索建议
Last updated