FlymeTV 全局搜索实践

solr 环境搭建

solr 版本选择

截至本文编写,Apache Solr 最新版本已经是 6.1.0,要求 JRE 1.8+,如下图

为此只能使用 Apache Solr 5.0+ 版本,浏览 solr 下载目录arrow-up-right,当前最新的 5.0+ 版本为 5.5.2arrow-up-right

下载安装

创建 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 Analyzerarrow-up-right,不过这个版本的 ik analyzer 只能用于 solr 4.x,如果要在 solr 5.x 使用,需要使用 ik analyzer solr5arrow-up-right,我们需要把源码 clone 到本地编译打包,生成 Ik-analyzer-solr5-5.x.zip

下载该文件到 solr 的dist目录下,解压缩后得到 ik-analyzer-solr5-5.x.jar,然后修改 solrconfig.xml 文件来引入该分词库

验证安装

core

通过浏览器打开 solr 后台页面来验证,访问地址为 http://ip:8983/solrarrow-up-right

能选择 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