产生背景
在整个项目中实现商品搜索功能电商项目中,因为用户有时候不是多么清楚他所需要的东西的名称或者商店的名称,有时候仅仅是只知道他所需要的商品是干嘛用的,又或者是有多个要求,为了满足用户的诸多需求更准确的查询到用户所需要的商品,所以就用到了Solr搜索引擎
简介
solr是一个基于Lucene的全文搜索服务器,相比Lucene更高效、使用更便捷,在进行模糊匹配的时候,他可以 用来替代数据库中的like ,从而在匹配准确性以及性能进行大幅度的提高。因为官方的分词器对中文支持不好所以使用了第三方的IK分词器来进行分词。在建立索引的时候我们通过在schema.xml配置IK分词器来完成中文分词。从而实现了高亮显示关键词,分页,排序,多字段,多条件的高性能搜索。
目前有很多优秀的中文分词组件 :像mmseg4j,IK Analyzer ,Paoding
通过查询资料发现用 IKAnalyzer比较好IK 比其他中文分词维护的勤快,和 Solr 集成也相对容易。
使用中的问题
我们在配IK分词器的时候,当时遇到了三个问题:
- 分词器版本与solr服务版本的匹配:
当时用的solr是4.10.4版本的因为这个版本比较好用,稳定,5.以上的版本bug比较多,配IK分词器的2012FF_u1版本,开始时用的是u6,然后配完效果出不来,上网查了好多资料,又问了之前加的一个搜索引擎群,才知道是版本问题,u3,u5,u6的都不好用,只有u1的和solr4.10版本的合适,改完之后问题确实解决了
- 加入分词器的schema文件要把version改为1.5基本的CRUD操作都可以,但是搜索却只能全字匹配或者只能单个字符匹配出结果。
这是绝对不能容忍的。定位问题接近了一天,找有经验的同事给 排查也没排查出来问题。最后我自己一点一点比对multicore文件夹下的配置文件跟F:\solr\solr-4.6.0\example\solr \collection1这个文件夹下的配置文件的配置区别。当我把schema.xml的version属性从1.1升到跟collection1下的相同文件的1.5一致之后。重启服务器,问题解决了!、
- 分词器的词典编码格式为UTF-8无BOM格式
在从数据中取数据生成索引的时候,因为表中的数据量比较大,防止一次取出所导致内存溢出问题,我采用了分段批量提取的方式进行,
- 此外我们为了提高solr搜索的性能对其进行了主从配置。
1. 我们solr使用的是solr4.7版本
2. 通过修改schema.xml来添加要进行索引的字段以及增加ik分词器
3. 通过solrj将数据库中的数据生成solr中的索引文件,注:solrj是java程序调用solr服务所用的jar包。
4. 通过在solrconfig.xml中配置requestHandler name=“/Replication”来进行主从同步的配置,在从solr中通过masterUrl指明要从哪些主solr服务器中同步数据
我们为了提高用户体验度还使用了solr的spellCheck可以用于查询输入的自动完成功能auto-complete。他是基于动态代码方式建立内容,suggestion可通过读文件方式建立内容,并有点击率排序。使用facet在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, facet的主要好处就是可以任意对搜索条件进行组合, 避免无效搜索, 改善搜索体验.