您的当前位置:首页正文

solr技术方案

2023-05-08 来源:好走旅游网
Solr技术方案

一 用户需求

以前的互动平台只能对固定表的固定字段做like这样的数据库层面的索引,性能低下,用户体验很差,很难满足业务提出的简化搜索的需求。 需求原型:

业界通用的做全站搜索的基本上两种:

1 选择googleAPI,百度API做。同第三方搜索引擎绑定太死,无法满足后期业务扩展需要,而且全站的SEO做的也不是很好,对于动态的很多ajax请求需要做快照,所以暂时不采用。 2 选择现有成熟的框架。

这里我们选择使用solr。

Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 创建的索引。 这里我们主要需要以下几种功能: 1 可用性及成熟性。 2 中文分词。

3 词库与同义词的管理(比如我们使用最高的:股票代码)。 4 高亮显示。 5 方便的导入数据。 6 Facet的轻松配置 7 扩展性。

二 Solr的体系结构

体系结构

Solr体系,功能模块介绍及配置。

以上是solr的架构图。具体应用时需要理解一下模块的作用及配置。

RequestHandler:接受请求,分发请求。另外也包含导入数据,如importhandler。 UpdateHandlers – 处理索引请求。

Search Components:作为handlder的成员变量。处理请求。 Facet:分类搜索

Tika:apache下处理文件的一个项目。 Filter,spelling : 处理字符串

Http query/update Database/html importhandler 默认基本可以满足要求。如果不够则扩展相应的handler和component。

丰富的客户端

Ruby/php/java/json/javascript 使用solrj

以上的配置在solrconfig.xml,schema.xml中配置

分词的解决办法

系统提供了很多种分词方案。

StopAnalyzer,StandardAnalyzer,WhitespaceAnalyzer只是实现了数字、单词、E-mail地址、IP地址以及中文字符的分析处理,但是对于中文的分析并不好。 对于中文分词有几种解决方案。

 Paoding: 100万汉字/s(https://code.google.com/p/paoding/)

 Imdict: 26万汉字/s (https://code.google.com/p/imdict-chinese-analyzer/)  Ik: 160万汉字/s (https://code.google.com/p/ik-analyzer/)

 Mmseg4j: simple 1900kb/s 准确率98%(https://code.google.com/p/mmseg4j/) 注:官方提供测试环境各不相同。 这里我们选择准确率最高的Mmseg4j。

而且配置起来也十分简单。我们只是需要在schema中配置以下fieldType即可。

三 搭建方法及配置

安装

solr版本:V4.3

1. 去apache网站http://lucene.apache.org/solr/ 下载 Solr4.3 2. 新建目录 /usr/local/solr

3. 将solr-4.3.0/dist/solr-4.3.0.war 复制到/usr/local/solr下,重命名为solr.war 4. 将 solr-4.3.0/example/lib/ext下的包复制到 Tomcat/lib目录下 5. 新建目录 /usr/local/solr/solr_home 作为solr 实例的跟目录

6. 将solr解压目录中的 contrib,dist,example/solr/* 复制到 solr_home 7. 在solr_home下新建lib目录,mkdir lib

8. 从dist/program/smsehome-solr/lib/拷贝除了solr-dataimporthandler-mongo-1.0.0.jar

之外的jar文件,中文分词包和数据库驱动包放到 lib下。 目录结构如下: └─lib

mmseg4j-analysis-*.jar mmseg4j-core-*.jar mmseg4j-solr-*.jar mongo-java-driver-*.jar mysql-connector-java-*-bin.jar

9. 将smsehome-solr/lib/solr-dataimporthandler-mongo-1.0.0.jar导入到disc目录下 10. 在solr_home下新建dic目录,mkdir dic。 11. 文件结构如下 └─solr_home

12. 拷贝发布文件data-config.xml ,solrconfig.xml ,schema.xml,solrcore.properties 到/usr/local/solr/solr_home/collection1/conf/ 目录下。 13. 修改solrcore.properties db_driver=com.mysql.jdbc.Driver

bin/ collection1/ contrib/ dic/ dist/ lib/

README.txt solr.xml Zoo.cfg

db_url=jdbc:mysql://172.26.1.110:3306/smsehome db_user=irmuser db_passwd=irmuser

mongodb_host=172.26.1.110 mongodb_port=27017 mongodb_database=admin mongodb_username=admin

mongod_password=BussINEssHome2013

file_path=http://172.31.16.233:8080/smsehome-web/showPicMongo.do?uploadFileMongoId

修改红色部分的配置。以db开头的mysql数据源,以mongodb开头的时候mongodb数据源。

单机环境到此就配置好了。

打开http://ip:8080/solr/#/ 可以看到dashboard和collection1表示安装成功。 打开http://ip:8080/solr/browse可以看到索引内容为空。

集群安装与配置

1下载zookeeper

http://zookeeper.apache.org/ 并解压 zookeeper。 新建zoo/data目录,用于存放zookeeper 的数据。

进入到目录zookeeper/conf 复制zoo_sample.cfg 为zoo.cfg,编辑zoo.cfg:

dataDir= /zoo/data clientPort=2181 server.1=192.168.1.11:2888:3888 server.2=192.168.1.12:2888:3888 server.3=192.168.1.13:2888:3888 dataDir设置zookeeper数据存放目录绝对路径

clientPort设置Zookeeper链接端口

server.i设置集群中服务器 的IP及端口号,i代表第几个服务器,与之对应的,需要在zoo/data中新建myid文件,文件内容为对应的i。

集群安装:分别在192.168.1.11,192.168.1.12,192.168.1.13上安装,/zoo/data/myid文件内容分别为配置中对应的1,2,3。

2 启动zookeeper.

启动zookeeper。zkServer.sh start。按照上面server 的顺序启动。Server.1,server.2,server.3。 3 配置tomcat。

将上面配置好的tomcat复制3份,把相应的solr.xml文件指定到工程目录。 4 配置其中一台为

JAVA_OPTS=”-Dbootstrap_confdir=/solr_home/collection1/conf -Dcollection.configName=clusterconf -DzkHost=192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181 -DnumShards=2” 参数:

-Dbootstrap_confdir为solr的配置文件目录 -Dcollection.configName为solrCloud配置显示名 -DzkHost为zookeeper服务器列表,逗号隔开 -DnumShards为分片个数 在其他机器

分别在192.168.1.2,192.168.1.3,192.168.1.4上配置/tomcat/bin/catalina.sh(.bat windows):

JAVA_OPTS=”-DzkHost=192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181” 此处仅配置-DzkHost即可,所有solr配置均从zookeeper中获取。

5 修改solr.xml

solr_home/solr.xml中的hostPort=\"8080\" 改为tomcat的启动端口 6 启动tomcat

启动顺序:首先启动指定了bootstrap_confdir的tomcat,然后启动其他solr的tomcat。

四 互动应用(POC)

应用方案设计

互动社区化应用架构图

需要索引的表

互动问题、回复、评论相关表:TB_IRCS_QUESTION等 活动信息表:TB_IRCS_ACTIVITY等 主题表:TB_IRCS_SUBJECT等 注册用户表TB_IRCS_INVESTOR等 话题表:TB_IRCS_TOPIC等 视频表TB_IRCS_VIDEO等

高管表TB_IRCS_COMP_LINKMAN,TB_IRCS_INVESTOR等。

Facet

具体整理一个《索引字段对应关系表.xls》

搜索引擎配置

全局配置 Solrconfig配置

1 配置系统和自己实现的dataimporthandler的jar包路径 2 solr索引的路径

${solr.data.dir:} 3 solr的查询接口

其中要配置facet信息,高亮信息和字段的权重信息。 4 solr的更新接口

使用默认字段即可。

5 使用数据库导入索引的配置

其中data-config.xml配置需要索引的数据库的信息、表名以及索引的字段。

Scheme配置

主要分为一下几块:Fields、types和copyField 的定义 Types定义:

name:标识字段。在fields中要引用到。

class和其他属性决定了这个fieldType的实际行为。(class以solr开始的,都是在org.appache.solr.analysis包下) 其中我们需要配置中文分词

上面是基于Mmseg4j的标准配置。 我们需要维护词库\"dicPath=dic

Spelling.txt,同义词库:synonyms.txt、停词库stopwords.txt.

Fields配置

所有的facet都要在schema中定义一种类型。在配置文件中配置。例如:

将相应表的字段都配置到schema中。 其中有四个参数: Name:要索引的字段名

Type:solr定义的类型。通常我们会加分词插件的类型。就是上面types里配置的字段。 indexed:是否被用来建立索引(关系到搜索和排序) stored:是否储存

compressed:[false],是否使用gzip压缩(只有TextField和StrField可以压缩) mutiValued:是否包含多个值

omitNorms:是否忽略掉Norm,可以节省内存空间,只有全文本field和need an index-time boost的field需要norm。(具体没看懂,注释里有矛盾)

termVectors:[false],当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。

termPositions:存储 term vector中的地址信息,会消耗存储开销。 termOffsets:存储 term vector 的偏移量,会消耗存储开销。 default:如果没有属性需要修改,就可以用这个标识下。 copyField的配置

例如:

将多个field的数据放在一起同时搜索,提供速度将一个field的数据拷贝到另一个,可以用2种不同的方式来建立索引。精确匹配和模糊匹配。

对于schema的配置情况,可以采用admin界面测试。

Analysis中Field Value (Index)显示是如何构建索引的。 右侧Field Value (Query)显示查询是如何分解索引的。

客户端API

索引更新API

http://ip:port/update?qt

第二种dataimporthandler,参见solr的维护界面。 信息查询API

http://ip:port/query?qt=

配置,在solrconfig.xml中配置请求的url。

其中可以配置分词的权重,页面需要的facet信息,高亮的信息。

因篇幅问题不能全部显示,请点此查看更多更全内容