solr 实现站内搜索+自动补全

至于s自己之前研究了一些东西,现在写下来,希望对需要的人有所帮助!有不对的地方请指正!博客搬家过来图片暂不支持显示,后续再补,望谅解。。。简书原文链接https://www.jianshu.com/p/83a456ab0ae3

1.Solr的安装及配置
1.1下载地址:http://lucene.apache.org/
从lucene的官网下载,lucene和solr的版本是同步更新的。我当时下的是4.7.0 ,目前版本7.4.0。

1.2 solr的文件夹结构

1.3 Solr的环境
要求jdk1.7以上。

要求tomcat也是7以上,我们使用的版本是apache-tomcat-8.0.

1.4 Solr集成tomcat
第一步:安装tomcat,如果解压版就直接解压。

第二步:把\solr-4.7.0\dist\solr-4.7.0.war文件复制到to mcat的webapp下。改名为solr.war。改名不是必须的,便于访问。

第三步:解压solr.war,启动tomcat自动解压。

第四步:把\solr-4.7.0\example\lib\ext文件夹下的jar包,日志相关的jar包添加到sorl工程的lib文件夹下。

第五步:创建一个solrhome,solrhome就是solr服务器配置文件存放的目录。\solr-4.7.0\example\solr文件夹就是一个标准的solrhome可以直接使用。

把solr文件夹复制到D:\temp\jee15目录下,然后改名为solrhome。改名不是必须,为了便于理解。

1、在solrhome中有一个collection1文件夹就是一个solrcore。一个solrcore就是一个完整的索引库。

2、在collection1文件夹下有一个conf文件夹,在此文件夹中包含了这个solrcore的所有配置文件。

3、solrconfig.xml和schema.xml两个重要的配置文件。先了解solrconfig.xml:

Lib:配置了索引库的扩展jar包的位置。默认是collection1\lib文件夹,如果没有就创建一个。

dataDir:索引库存放的目录。默认是collection1\data文件夹,如果没有solr启动后会自动创建。

requestHandler:配置了solr对外提供服务的url。

查询索引使用的url:

维护索引时使用的url:

defaultQuery:默认的查询语法

可以根据实际情况对solrconfig.xml进行配置,如果使用默认配置可以不修改此配置文件。

第六步:告诉solr服务器solrhome的位置。使用jndi的方式。修改solr工程的web.xml文件

如我的solrhome是在D:\solr\solrhome

第七步:启动tomcat

第八步:访问http://localhost:9999/solr/

2.Solr的功能介绍
2.1 Core Admin配置管理solrcore的功能。每个solr服务可以有多个solrcore每个solrcore是独立的索引库。类似于mysql的数据库。

2.2 添加solrcore
步骤:

第一步:把collection1复制一份改名为collection2

第二步:修改collection2下的core.properties文件,修改name=collection2

第三步:重新启动tomcat

2.3 Analysis
查看某个域的分析效果。

2.4Dataimport
把数据库中的数据批量导入到索引库中使用的功能。需要手工配置。

2.5Documents

实现对索引库的增删改操作

2.6Query
查询索引使用的功能

3 . Schema.xml
在solr中域必须先定义后使用,不能随便起名字。所有的域都是定义在schema.xml中。

3.1Field
域的定义

Name:域的名称

Type:域的类型

Indexed:是否索引

Stored:是否存储

multiValued:是否多值。在一个域下存储多个值。一个域下存储一个数组。

3.2dynamicField
动态域。

Name:动态域的名称的表达式,域的名称只需要和表达式向匹配就可以使用。

Type:域的类型

Indexed:是否索引

Stored:是否存储

multiValued:是否多值。

3.3uniqueKey
文档的唯一id,每个document必须有一个id域,相当于数据库中表的主键。

3.4copyField
复制域,功能就是在添加文档的时候自动的把源域的内容复制到目标域。可以把目标域作为默认搜索域可以提高查询的性能。

Source:源域

Dest:目标域

3.5 fieldType
域类型的定义。

Name:域的名称

Class:对应的java 的类,是对应的域的实际类型。

可以定义一个fieldtype使用中文分析器这样就可以满足业务需求。Class必须是class=”solr.TextField”

3.6配置中文分析器
需要自定义一个fieldType,并且class是solr.TextField。中文分析器使用的是IK-Analyzer。

3.6.1实现步骤
第一步:把IKAnalyzer2012FF_u1.jar添加到solr工程的lib文件夹下。

第二步:把配置文件和自定义词典和停用词词典添加到solr工程的classpath下。注意词典的字符集是utf-8。(没有就新建一个文件夹)

第三步:在schema.xml中添加一个自定义的fieldType。(要注意写在types标签内部,不然没用,自己当时没注意踩过坑T T…)

                            <fieldType name="text_ik" class="solr.TextField">

第四步:定义field,type使用text_ik

<!–IKAnalyzer Field–>

第五步:重新启动tomcat

3.7 设置业务系统Field
如果不使用Solr提供的Field可以针对具体的业务需要自定义一套Field,如下是商品信息Field:

4.索引库的维护
4.1 文档的添加
要求每个文档中必须有一个id域,并且文档中的域必须在shema.xml中定义。

数据格式有很多类型

4.2 文档的删除
4.2.1根据id删除文档
首先把Document Type选为xml,然后执行:

a0001

提交

4.2.2 根据查询删除文档

4.3 修改文档
本质也是先删除后添加,只能是添加一个新的文档只要文档的id和被更新的文档一致即可。

4.4 使用dataimport插件批量导入数据
数据源是mysql数据库中的表。

使用dataimport插件把数据库中的数据导入到索引库中。

4.4.1需要用到的jar包:
1. dataimport插件依赖的jar包

2.mysql的数据库驱动

4.4.2 配置dataimport插件
第一步:把插件依赖的jar包(dataimport插件和mysql)放到collection1\lib文件夹下。

第二步:在solrconfig.xml中添加一个requesthandler节点。

    <str name="config">data-config.xml

< /lst>

第三步:创建一个data-config.xml放到collection1\conf文件夹下也就是solrconfig.xml 所在的文件夹。

第四步:重启tomcat。

  1. 索引库的查询
    Q:总查询条件,完全支持lucene的语法。并且支持数值类型的范围查询。

Fq:过滤条件。和查询条条件的查询语法是一样的。并且可以有多个过滤条件,过滤的数据基础是总查询条件得到的结果集。

Sort:排序条件。排序的域 asc|desc,多个过滤条件可以使用半角逗号分隔。

start, rows:分页处理。和mysql的分页处理一样。

Fl:返回结果中域的列表

Df:默认搜素域。

Wt:返回结果的数据格式。可以是json可以是xml

Hl:高亮显示

Hl.fl:高亮显示的域

Hl.simple.pre:高亮显示的前缀

Hl.simple.post:高亮显示的后缀

6.使用SolrJ维护索引库
6.1 环境搭建
我用SpringMVC+Maven搭建项目

第一步:创建一个Maven工程。

第二步:把solr客户端solrj的依赖添加pom.xml

6.1.1相关配置文件

resource.properties

db.properties

applicationContext-dao.xml

applicationContext-service.xml

applicationContext-solr.xml

springmvc.xml

6.2 使用solrJ维护索引
6.2.1导入商品数据到索引库

6.2.2 索引库删除商品

6.2.3,更新索引

6.3 使用solrj查询索引
6.3.1 查询步骤
第一步:创建一个SolrServer对象实现和服务器的连接。

第二步:创建一个SolrQuery对象。

第三步:向solrQuery对象中添加查询条件。

第四步:执行查询。返回一个文档的列表

第五步:遍历返回结果。

代码实现:

我用Postman测试:

7.0 solr-facet的自动补全
用Suggester的组件来实现自动完成功能

7.1配置
在索引配置之前,我们定义一个searchComponent:

这个组件是基于solr.SpellCheckComponent的,这样我们就可以使用它的一些配置。配置中有3个非常重要的属性:

name:组件名

lookupImpl:绑定这个搜索的对象,目前有两个类可以使用-JasperLookup、TSTLookup,第二个效率更高

field:针对的字段

现在让我们添加合适的handler

非常简单的配置,它定义了Search的组件,告诉solr每次建议的最大个数为10,使用上面定义的suggest组件。

索引假设我们的文档有三个字段:id、name、description。我们想给name字段做自动完成功能,索引配置则为:

另外,需要定义一个copyFiled:

单词建议为了完成单独词的建议,我们需要定义一个 text_autocomplete的类型:

词组建议如果实现完整的词组建议,我们的text_autocomplete类型应该定义为:

建立词典在我们开始使用该组件前,我们需要对它建立索引,可以使用solr命令:

/suggest?spellcheck.build=true

7.2 查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值