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#)WPF:Grid面板介绍
Grid:网格面板 Grid和其他各个Panel比较起来,功能最多也最为复杂.要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefi ...
- hdu 5901 Count primes (meisell-Lehmer)
Count primes Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
- Lab8:文件系统
文件系统的概念 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能 文件是具有符号名,由字节序列构成的数据项集合 文件系统的功能 分配文件磁盘空间 管理文件块(位置和顺序) 管理空闲空 ...
- shell——数组
默认从0开始索引:也可以单独(像字典一样)pid[35420]=httpd -k ssl, 只能是一维的 bash4.0增加了关联数组 数组赋值: declare -a myarray声明数组 一次一 ...
- Opencv的线性滤波和非线性滤波
线性滤波 :方框滤波 均值滤波 高斯滤波 非线性滤波: 中值滤波 双边滤波 这几个滤波都是起模糊作用 去除噪点 不废话了 下面是代码 #include <opencv2/opencv.h ...
- 关于Java 值传递深度分析
首先说观点:java只有值传递没有引用传递 然后再来看看值传递与引用传递两者的定义 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改, ...
- Android性能优化总结
合理的管理内存 节制地使用Service,尽量使用IntentService 避免在Bitmap上浪费内存,压缩图片处理 谨慎使用抽象编程 尽量避免会用依赖注入框架 使用ProGuard简化代码,好处 ...
- day 28 黏包 ssh模块 subprocess模块
套接字的信仰 一切皆文件 昨日作业: import socket sock=socket.socket() # TCP协议 IP_PORT=("127.0.0.1",8899) s ...
- es5设置属性不能修改
/*es5*/ { var Person ={ name:'es5', age:19 } Object.defineProperty(Person,'sex',{ writable:false, va ...