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

至于solr自己之前研究了一些东西,现在写下来,希望对需要的人有所帮助!有不对的地方请指正!

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">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

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


<!--IKAnalyzer Field-->

<field name="title_ik" type="text_ik" indexed="true" stored="true" />

<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

第五步:重新启动tomcat

3.7 设置业务系统Field

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



4.索引库的维护

4.1 文档的添加

要求每个文档中必须有一个id域,并且文档中的域必须在shema.xml中定义。


数据格式有很多类型

4.2  文档的删除

  4.2.1根据id删除文档

首先把Document  Type选为xml,然后执行:

<delete>

<id>a0001</id>

</delete>

<commit/>提交

  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节点。

<requestHandler name="/dataimport"  class="org.apache.solr.handler.dataimport.DataImportHandler">

  <lst name="defaults">

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

  < /lst>

</requestHandler>

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




第四步:重启tomcat。


5. 索引库的查询

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 查询


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,953评论 6 342
  • 最重要的一点,在最后阶段,圈子越来越小的时候,最好不要主动开枪打人,因为范围小,你一开枪,所有人就都过来了。最好是...
    Saythendoit阅读 203评论 0 0
  • 童年记忆。咏诗怀古。想象空间很大。 各种名词,食物出现的频率比较高。生活写实。 各类词性混用,词汇多样,看起来更靠...
    ef26fc288822阅读 225评论 0 0