Solr
什么是Solr
Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企业级的,快速的和高度可扩展的。 使用Solr构建的应用程序非常复杂,可提供高性能。
为了在CNET网络的公司网站上添加搜索功能,Yonik Seely于2004年创建了Solr。并在2006年1月,它成为Apache软件基金会下的一个开源项目。并于2016年发布最新版本Solr 6.0,支持并行SQL查询的执行。
Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。
以上是官方文档对Sor的解释,简单来说Solr就是一个很强的全文检索工具,就比如我刚刚在百度词条的搜索框搜索Solr这个过程就是依赖于Solr技术的。当然也不一定百度用的就是Solr工具,可能他用的更强一点哈哈(直白?)
Solr存在的意义是什么
由于大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。
这样转移负载到一个外部的搜索服务器就是一个不错的主意了,Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,这也就确保你能从几乎任何编程语言来使用solr。
总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。
举例
举个例子:现在有几个文档,我想从这几个文档中查找出包含“solr工作原理”的文档,此时有两种做法:
-
顺序扫描法:对这几个文档依次查找,包含目标字段的文档就记录下来,最后查找的结果可能在这几个文档中,这种查找方式叫做顺序扫描法。
顺序扫描法在文档数量较少的情况下,查找速度还是很快的,但是文档数量很多时,查找速度就明显不行了。 -
全文检索:对文档内容进行分词,对分词后的结果创建索引,然后通过对索引进行搜索的方式叫做全文检索。
全文检索就相当于根据偏旁部首或读音去查找字典,在文档很多的情况,这种查找速度肯定比一个一个文档查找要快。
中文分析器IK Analyzer
就如上文所说,Solr会把一句话分割成多个分词,然后进行检索。这个划分分词的技术就是中文分析器IK Analyzer
IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
这个中文分析器需要对Solr进行配置的,不然Solr怎么会有这个技术呢是吧。
IK Analyzer配置
步骤:
- 把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下
- 创建WEB-INF/classes文件夹 把停用词词典stopword.dic、配置文件IKAnalyzer.cfg.xml放到 solr 工程的 WEB-INF/classes 目录下。
- 修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer
<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
Solr运行原理
全文检索大体分为2个过程,索引创建和搜索索引
-
索引创建:将现实世界中的所有结构化和非结构化数据提取信息,创建索引的过程
-
索引索引:就是得到用户查询的请求,搜索创建的索引,然后返回结果的过程
创建索引分析
举例
文档一内容:solr是基于Lucene开发的企业级搜索引擎技术
文档二内容:Solr是一个独立的企业级搜索应用服务器,Solr是一个高性能,基于Lucene的全文搜索服务器
首先经过分词器分词,solr会为分词后的结果(词典)创建索引,然后将索引和文档id列表对应起来,如下图所示:
分析过程:solr在文档1和文档2中都有出现,所以对应的文档ID列表中既包含文档1的ID也包含文档2的ID,文档ID列表对应到具体的文档,并体现该词典在该文档中出现的频次,频次越多说明权重越大,权重越大搜索的结果就会排在前面。
solr内部会对分词的结果处理:
-
去除停词和标点符号,例如英文的this,that等, 中文的”的”,”一”等没有特殊含义的词
-
会将所有的大写英文字母转换成小写,方便统一创建索引和搜索索引
-
将复数形式转为单数形式,比如students转为student,也是方便统一创建索引和搜索索引
创建索引的过程
-
有一系列被索引文件
-
被索引文件经过语法分析和语言处理形成一系列词(Term)。
-
经过索引创建形成词典和反向索引表。
-
通过索引存储将索引写入硬盘。
搜索索引
知道了创建索引的过程,那么根据索引进行搜索就变得简单了。
- 用户在搜索框输入关键字进行搜索动作
- solr得到分词技术对用户输入的关键字或关键语句进行分词切割处理
- 然会对处理后的分词结果创建索引
- 然后根据索引找到文档ID列表
- 最后在根据文档ID列表找到具体的文档内容,然后通过权重分析,顺序向下排列将结果返回给用户