solr
solr是一个独立的企业级的搜索应用服务器,他对外提供类似于web-service的API接口(数据:xml),用户通过http请求,向搜索引擎的服务器提交一定格式的XML文件,生成索引;也可以通过http get操作提出查找请求,并得到xml格式的返回结果。
【总结】:
- solr式独立的搜索服务器(直接用:war包-----部署到tomcat里)
- solr是基于lucene开发的(lucene只是一套全文检索的工具包–api)。
项目用到solr的地方:
- 商品信息保存到索引库中。
- 我们需要在item类中添加注解@Field注解.
- 添加springdatasolr的配置文件
- 商品审核成功后将数据保存到索引库中。
- 商品检索的时候,入参(传递的条件):
- 搜索的关键字
- 商品的分类
- 商品的品牌
- 商品的规格
- 商品的价格,新品等等。
- 可以将入参的条件进行封装(key1:value1 ,key2:value2)到map集合中。
- 出参(返回值):
- 商品的结果集
- 商品的分类
- 商品的品牌
- 商品的规格
5.返回的值也可以封装成map集合。
检索的过程:通过关键字------>加载分类-------------》品牌结果集,规格结果集。
- 将库存表的数据全部保存到索引库中。
- 库存表中有一个字段叫spec,spec:{“机身内存”:“16G”,“网络”:“联通3G”}-----》转成map(JSON.parseObject(spec,map.class)?
- 前台系统的关键字的检索。springdatasolr里面提供了高亮的api(hightlightoption()),先拿到list(hightlighted),遍历拿到list(hightlightentry),hightlightentry.get(0).getsnipplets(0).get(0)就可以将关键字进行高亮。
solr的底层分析:
我们得先了解lucene这个全文检索库,生活中数据大体分两种,其一:结构化的数据,指具有固定的格式或有限长度的数据,如数据库,元数据。其二:非结构化数据,指不定或无固定的格式的数据,如邮件,word文档。
对非结构数据,也就是全文检索主要有两种方法,顺序扫描法,就一个一个文档的看,浪费时间。顺序扫描对结构化的数据搜索相对较快,采取了算法加速检索。有人就提出了,那我们将非结构弄得有结构就可以了,这是构成全文检索得基本思路,也就是将非结构得数据得一部分信息提取出来,重新组织,使其变得有结构,从而达到检索相对较快。这部分的从非结构中提取出来的数据重新组织后的信息,我们就叫索引。
这种先建立索引的,再对索引进行搜索的过程就叫全文检索。
1.【 索引的时候】:计算机通过索引程序,扫描文件中的每个词语,建立词语与文件的对应的关系,把对应的关系保存在索引库。索引的流程:
2.【 搜索到时候】:计算机通过检索的程序,根据用户的输入的关键的词,在索引库搜索目标内容。
检索流程:
- 【采集数据】:通过jdbc操作获取数据库数据。通过io操作获取文件上的数据。通过爬虫获取网络上的网页数据。
- 【建立文档对象】:一个文档对象中包含多个域(Field),一个文档对象就相当于关系数据库表中的一条记录,一个域相当于一个字段。
6.【 分析文档】:把原始数据转换成文档对象,使用分词器将域中内容切分一个一个词语,目的方便后续的建立索引做准备。 - 【建立索引】:建立倒排索引,建立词语与文档的对应的关系,词语在什么文档出现,出现几次,在什么位置出现。将倒排索引保存到索引库中。
- 【建立查询对象】:根据用户输入的关键字,建立查询对象(Query),Query对象会生成查询的语法,比如bookname:java,表示搜索图书名称域中的,包含java的图书。
分词器的介绍:
为什么要用到分词器?- 在对文档中的内容进行索引前,需要对域Field中的内容使用分析对象(分词器)进行分词,分词的目的是为了索引,索引的目的是为了搜索。过程是先分词,再过滤。
- 分词:将文档中的域Field的值切分成一个一个的单词,具体怎么分根据使用的分词器不同。
- 过滤:去除标点符号,去除停用词(的,啊,是等等),为什么用到停用词,为了节省空间,提高检索的效率。
- 第三方的中文分词器,ik
- ik分词器就是扩展了lucene的分词器(analyzer),使用方式与lucene分词器一样。
- 图书的id,不分词,需索引,需存储。-------stringfield
- 图书的名称,需分词,需索引,需存储-----------textfield
- 图书价格,需分词,需索引,需存储---------doublefield
- 图书图片,不分词,不索引,需存储。------------storefield
- 图书描述,需分词,需索引,不存储。-------Textfield
- 在对文档中的内容进行索引前,需要对域Field中的内容使用分析对象(分词器)进行分词,分词的目的是为了索引,索引的目的是为了搜索。过程是先分词,再过滤。
关键词 文章号[出现频率] 出现位置
guangzhou 1[2] 3,6
he 2[1] 1
i 1[1] 4
live 1[2] 2,5,
2[1] 2
shanghai 2[1] 3
tom 1[1] 1
(2019.6.10)补充:
用到solr来做搜索,怎么实现搜索的精准度的?
solr是用来干嘛的?
基于Lucene,主要做全文检索。同样技术,es
小项目直接数据库查询,大点的项目用solr,es,大部分查询都是like查询,引进全文检索技术(用solr,不用es)
大概介绍介绍?
设计到两个端(客户端,服务端)
服务端,安装解压war包,添加jar包,配置schema.xml
客户端用到spring-data-solr,封装给了service,controller直接传入对象给service就好。
Solr 是传统搜索应用的有力解决方案(电商项目),但 Elasticsearch(新浪微博评论吐槽) 更适用于新兴的实时搜索应用
solr和es?为什么考虑solr
es维护较少,只支持json文件格式,不过开箱即用,solr成熟,社区更加成熟支持json,xml,安装复杂点。
通过关键字–》加载分类----》品牌结果集,规格结果集(爬山靴子,什么码数,什么颜色),默认就加载第一个分类下的品牌结果集,规格结果集。提高搜索精准度用到分配权重。
将检索到的数据封装到一个map中,根据关键字分页,高亮,加载分类结果集,加载品牌,规格结果集,模糊查询:criteria.is(keywords);//is不是等于某个值。is方法:根据词条进
行模糊检索 like%%。