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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

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