目录

solr介绍

中文分析器

IK Analyzer(solr后台引入分析器,不是java项目)

扩展词典

停用字典里

域的配置

自定义域(自己的项目)

复制域

动态域

spring data solr

@Field注解

创建测试类

添加数据

删除数据

查询数据

分页查询(表达式查询)

条件查询

数据库的数据的导入solr

动态域的导入

搜索案例

高亮显示搜索内容

前台的处理(angularJS问题)


前言

ElasticSearch基础  https://blog.csdn.net/yzj17025693/article/details/89636313

ElasticSearch和solr都是搜索引擎框架

其中spring data solr又是对solr的封装

lucene基础 https://blog.csdn.net/yzj17025693/article/details/89607341#field(域)的分类

spring data solr 进阶  https://blog.csdn.net/yzj17025693/article/details/90453043

 

solr介绍

spring data solr 基础

在windows下安装solr

spring data solr 基础

spring data solr 基础

solr管理后台

spring data solr 基础

选择 核心 collection1

spring data solr 基础

点击execute

spring data solr 基础

q是查询的语句,*.*代表查询所有,右边是查询的结果,冒号: 前面的*代表域,冒号后面的*代表表达式

关于表达式可以百度查询

spring data solr 基础

 

 

 

中文分析器

如果学过elesticsearch的知道如果使用中文搜索,就必须要中文分析器(分词器)

默认的分析器会对中文进行逐字拆分,很名称不是我们想要的,因为  程序员  和  程序 肯定都是不可分的词语

spring data solr 基础

 

IK Analyzer(solr后台引入分析器,不是java项目)

spring data solr 基础

1 是停用词词典

2 是扩展词典

3 配置文件

spring data solr 基础

扩展词典

主要是写一些自定义的词,因为有些词是网络用语和指定名称,并不是常用的词,所以分析器识别不出来

spring data solr 基础

停用字典里

主要是以语气词为主,因为语气词对搜索没有意义,还有一些国家禁用词汇也可以在里面添加

spring data solr 基础

 

 

配置文件里主要是进行词典的配置

spring data solr 基础

solr后台引入分析器

spring data solr 基础

spring data solr 基础

指定刚刚我们引入的分析器,name是text_ik进行分词

spring data solr 基础

 

域的配置

spring data solr 基础

在sechmax.xml已经有很多域了,这是solr框架自带的,相当于数据库的字段 

lucene基础 https://blog.csdn.net/yzj17025693/article/details/89607341 里有这些属性的说明

spring data solr 基础

 

自定义域(自己的项目)

type必须是sechma.xml里<field>的name

商品的名称和商家的名称都需要使用分词器

而图片地址,不需要索引,因为我们不会搜索图片地址,只需要储存,因为搜索出来的商品需要显示图片

而平台,需要索引和储存,我们可能会根据商家查询,并且获取商家的信息,所以就需要存储

而存储是否,如果存储,那么可以通过document.get方法取出来,但是如果不存在,那么就不能通过get方法取出

但是可以通过QueryTerm查询出来,并不影响查询

spring data solr 基础

 

复制域

普通的域是不关联的,所以我们多条件查询,也就是同时查询名称和平台,这时候就需要一个一个域找,需要写很多判断

这时候就很麻烦了,使用了复制域,可以把我们写的域给整合成一个域,做查询的时候,只需要查询这个域即可

这个域stored是不存储的,只做索引,因为只查询

multivalued代表多值,做复制域的时候需要配这个,也就是一个域里可以有多个数值

spring data solr 基础

 

动态域

我们存一个域,而这个域名是不固定的,因为如果是手机,域名是机身内存

如果是平板电视,域名是电视屏幕尺寸

spring data solr 基础

spring data solr 基础

在sechma.xml里配置dynamicField

spring data solr 基础

 

spring data solr

这里我们直接讲解spring data solr 而不讲解solrj

maven依赖

spring data solr 基础

添加applicationContext.-solr.xml ,使用solr模版

spring data solr 基础

 

@Field注解

之前我们在sechma.xml里设置了域,这里我们使用注解方式对应solr的域

spring data solr 基础

 

创建测试类

添加数据

saveBean可以保存实体类,记得还需要commit

修改和删除的方法都是saveBean,这时候如果id变了,就会增加,id没变就是修改

spring data solr 基础

这时候后台就会显示数据

spring data solr 基础

 

删除数据

spring data solr 基础

 

查询数据

spring data solr 基础

 

分页查询(表达式查询)

如果不设置分页条件,那么就是查询全部, *:*  如果冒号前面指定了一个了域,那么只查询那一个域的数据

spring data solr 基础

spring data solr 基础

 

条件查询

只需要在Query里添加Criteria即可

spring data solr 基础

 

数据库的数据的导入solr

导入配置文件

spring data solr 基础

spring data solr 基础

 

导入代码

其实不需要遍历出来,直接保持即可

spring data solr 基础

直接保存list,而list里的实体类需要加上@Field注解

spring data solr 基础

 

动态域的导入

把这样的数据导入到solr里

spring data solr 基础

所以域名是不确定的

spring data solr 基础

先用fastJson把源字段spec转换成json,然后复制到specMap中

我们在这个字段上用了Dynamic 那么自动会获取json的key用来填充星号

spring data solr 基础

 

搜索案例

接口的编写

如果只传一个关键词,比如说 苹果 ,那么这个接口没问题

但是后面还有什么分类,规格,假如我们搜索了苹果后,下面的选项有水果和手机

这时候我们点击手机,就应该要继续查询,所以这个接口应该修改

spring data solr 基础

可以把接受的值和返回值都改成Map,这个比较通用,需要的时候从map里取值即可

spring data solr 基础

 

实现类

第1

Criteria里是域名称

is 是匹配查询,为什么不用包含,因为Criteria里已经进行了分词,所以里面的字符串是一段一段的(之前就已经把数据库的数据导入进来了)

使用is后,会使用分词的算法进行匹配

第2 把集合的数据封装到rows里,方便前端直接回显

spring data solr 基础

控制层直接返回数据给前台即可

spring data solr 基础

 

前台的处理

controller层

spring data solr 基础

绑定数据

spring data solr 基础

spring data solr 基础

 

高亮显示搜索内容

simpleHighlightQuery有点东西,传入Criteria的时候,会把我们的关键词存起来,当我们查询的时候,会给它加上后缀

返回的内容加上标签即可,这个在elesticsearch里也讲解了

spring data solr 基础

这个item_title在数据库里是 商品名,平拍,规格之类的组合,存到solr里也是类似的

addField只是指定这个域的内容需要高亮,并不是给整个title加上前缀和后缀

spring data solr 基础

 

下面其实只是获取域里的值,然后设置到title里,高亮在上面就已经搞好了

第1 getHighlights 获取的是高亮域的个数,我们上面只指定了一个,就是item_title

第2 这个注解掉的循环,是因为可能有多域,而getSnipplet(获取片段),是因为可能有多值,所以还是返回了一个集合

但这不是重点,重点是让搜索的内容高亮显示

第3 getHighlights.get(0) 是因为我们现在只想高亮标题,getSnipplet.get(0)是因为我们目前一个域一个值

,因为我们的标题在一起就组合在一起,生成一串字符串,所以不组合,那么这个就可能要循环了

然后setTitle里面获取的是 带有高亮字段的标题

spring data solr 基础

 

前台的处理(angularJS问题)

如果前台是用的angularJS显示,也就是{{item.title}},那么可能不会显示内容

因为可能会有html攻击,防止有人把一些内容内嵌到html里,请求给后台就出问题了

spring data solr 基础

spring data solr 基础

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-09-07
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2021-11-16
  • 2022-12-23
  • 2022-01-03
  • 2022-12-23
猜你喜欢
  • 2021-08-21
  • 2022-12-23
  • 2022-01-15
  • 2022-12-23
  • 2021-10-31
  • 2021-11-06
  • 2021-06-07
相关资源
相似解决方案