solr索引基本原理
solr是一个全局检索引擎,能够快速地从大量的文本数据中选出你所需要的数据,而你只需要提供相应的关键词进行检索。solr的高效率查询靠的是底层强大的索引库,所以solr最关键的技术也是其底层的索引设计。solr工作的时候可以归结成两个过程1.创建索引2.搜索索引。
这是一张solr的基本工作图:

如图所示:
1.图中横线左边部分说明了solr中的数据来源,solr可以从数据库中获得数据,用户只需要简单的操作即可将数据库中的数据导入到solr中,除了数据库外solr可以从文件系统中保存数据,能直接保存互联网的数据,当热用户也可手动导入数据。
2.图中的index Documents就是前文所说的两个过程中的第一个创建索引,solr必须对导入的数据创建索引来保证查询的效率。
3.图上最底下有个index,表示一个索引库,索引库可以近似的看成是一个数据库,前面创建的索引必须保存在索引库中。
4.图中的横线上边右半部分表示了用户对solr的查询,用户通过各种方式对solr进行查询(如手动在solr管理页面上,通过solrj进行查询),查询到达solr后,solr进行search index(去索引库中对刚刚创建的索引进行检索)来找到用户想要得到的数据,并将数据集返回给用户。
solr索引
solr的索引类似如下图:

solr的索引是一个反向索引,比如说现在要找带solr这个词的数据,那么首先会在词典中找到solr这个词,在倒排表中会有一个链表与solr这个词关联着,这个链表就是带有solr这个词的文本集的序号集。
索引的创建过程
索引的创建过程可以分为:1.分词组件2.语言处理组件3.索引组件
1.分词组件:
当数据存入solr的时候首先会通过分词组件,分词组件的作用1.将数据分成一个个词汇。2.去除标点符号.3.去除停词(比如中文的“的”,“和”,“啦”等等)
比如存入“Students should be allowed to go out!”分词组件会先将句子分成多个单词“Students”,“should”,“be” ,“allowed”,“to”,“go”,“out”,“!”。随后会进行第二部将标点符号“!”去掉,最后第三步会将“to”,“be”去掉。最后留下的结果为:“Students”,“should”,“allowed”,“go”,“out”。
注意:可以看出我们再对solr进行搜索的时候应该尽量避免使用符号或者停顿词作为检索关键词。
2.语言处理组件:
语言处理组件的作用如下:
1.变为小写(Lowercase)。
2.将单词缩减为词根形式,如”cars”到”car”等。这种操作称为:stemming。
3.将单词转变为词根形式,如”drove”到”drive”等。这种操作称为:lemmatization。
注意:至此索引创建完成,搜索”drive”时,”driving”,”drove”,”driven”也能够被搜到。因为在索引中,”driving”,”drove”,”driven”都会经过语言处理而变成”drive”,在搜索时,如果您输入”driving”,输入的查询语句同样经过分词组件和语言处理组件处理的步骤,变为查询”drive”,从而可以搜索到想要的文档。Lowercase,stemming同理
3.索引组件
假设现在有两个文档:
文档一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文档二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
经过前两个组件的处理后得到如下索引:
Term Document ID
student 1
allow 1
go 1
their 1
friend 1
allow 1
drink 1
beer 1
my 2
friend 2
jerry 2
go 2
school 2
see 2
his 2
student 2
find 2
them 2
drink 2
allow 2
对字典按字母顺序排序:
Term Document ID
allow 1
allow 1
allow 2
beer 1
drink 1
drink 2
find 2
friend 1
friend 2
go 1
go 2
his 2
jerry 2
my 2
school 2
see 2
student 1
student 2
their 1
them 2
合并相同的词(Term)成为文档倒排(Posting List)链表

Document Frequency:文档频次,表示多少文档出现过此词(Term)
Frequency:词频,表示某个文档中该词(Term)出现过几次
索引的检索
通过前几步索引的创建,现在就可以对创建的索引进行检索了。
1.当用户的检索关键词进入solr后,solr会对传入的关键词进行处理,具体处理过程类似创建索引时语言处理组件对文档词汇的处理过程。
2.将处理后的词在词典中搜索得到一个文档集。
3.将文档集根据词频将文档集进行相关性排序。
4.将结果集返回给用户
solr索引基本原理的更多相关文章
- 使用Solr索引MySQL数据
环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...
- [solr] - 索引数据删除
删除solr索引数据,使用XML有两种写法: 1) <delete><id>1</id></delete> <commit/> 2) < ...
- 将数据库表导入到solr索引
将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name="/dataimport" class="org ...
- 利用SOLR搭建企业搜索平台 之——Solr索引基本操作
来源:http://blog.csdn.net/zx13525079024/article/details/25367239 我们来看下通过界面来操作SOLR,包括SOLR索引的添加,查询等基本操作. ...
- 使用solrj操作solr索引库
(solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...
- 使用solrj操作solr索引库,solr是lucene服务器
客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...
- solr索引
solr索引 当我们真正进入到Lucene源代码之中的时候,我们会发现: • Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程. • Lucene的搜索过程,就是按照此 ...
- 将数据库的数据导入solr索引库中
在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例. 首先要准备jar包:solr-dataimporthandler-4.8.1.jar.solr-dataimport ...
- 如何在分布式环境中同步solr索引库和缓存信息
天气依旧很好,主要是凉快.老习惯,我在北京向各位问好. 搜索无处不在,相信各位每天都免不了与它的亲密接触,那么我想你确实有必要来了解一下它们,就上周在公司实现的一个小需求来给各位分享一下:如何在分布式 ...
随机推荐
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- PHP 从另一个角度来分析 Laravel 框架的依赖注入功能
从根本上说,依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题” 你为"某些人的问题”注入了类的依赖关系. ...
- 编译spark支持thriftserver
cdh默认把spark的spark-sql以及hive-thriftserver给弃用掉了,想玩玩thriftserver,于是自己重新编译一个 官网参考: http://spark.apache.o ...
- asp.net以流导出Excel
废话不多说,直接上代码 这是点击导出的事件函数,因为我是从前端获取的Table的json数据,所以需要转换一下,大家直接用查询出来的DataTable即可 protected void bt_expo ...
- 简单说说基于JWT的token认证方式
一.什么是认证 好多人不知道什么是认证,认证,其实就是服务端确认用户身份.Http协议是无状态的,客户端发送一条请求,服务端返回一条响应,二者就算做成一单买卖,一拍两散.在很久以前,互联网所能提供的服 ...
- [学习笔记] 在Windows 10上安装 WebLogic 12.2.1.3
本文适用于学习目的而撰写.截止目前WebLogic已经有12.2.1.4.0了. 在安装WebLogic 12.2.1.3.0 首先要在Windows10之上Oracle JDK 1.8. 当前认证 ...
- PHP变量的初始化以及赋值方式介绍
什么是变量 变量通俗的来说是一种容器.根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同.在变量中存放的数据,我们称之为变量值. PHP 中的变量用一个美元符号后面跟变量名来表示.变量名 ...
- 2019-11-26:密码学基础知识,csrf防御
信息安全的基础是数学--->密码算法--->安全协议(ssl VPN)-->应用(证书 PKI)密码学入门密码编码学:研究加解密算法的学科密码分析学:研究破译密码算法的学科 加解密分 ...
- 2019-10-12,html+php+mysql简单留言板,作业
php+mysql简易留言板,实现注册,登录,注销,查看留言,删除留言 1,index.html登录页面 代码: <!doctype html> <html> <head ...
- SpringMVC请求参数接收总结(一)
前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...