欢迎关注《Java面试题2.0》合集发布页,持续更新中!
概念:
Solr是目前非常受欢迎的基于Apache开源组织下Lucene开发的一个开源高性能的企业级搜索平台。Solr具有高度可靠性、可扩展性、可容错性的特点,提供了分布式索引、索引备份、查询负载均衡、自动故障转移和恢复,以及集中配置等功能。
core
想要在Solr中添加索引,你需要指定一个Core,即你需要把索引数据添加
Solr中的Core术语指的是一个单一的索引数据,而索引又是由多个Document组成的,所以你把Core理解为多个Document打包成的一个集合。需要注意的是,Solr里的Document是扁平化的,即两个Document的域可以完全不同,也就是说表示客户信息的Document和表示产品信息的Dcoument这两个完全不同结构的数据可以放到一个Core里
Solr设计多Core来存放索引就是为了实现把两个不相干的对象进行分离独立管理,这样每个对象的索引都有自己的一套Schema.xml、solrconfig.xml进行管理,彼此之间互不影响。比如有客户和订单两个对象,你可以将他们分成两个Core存储,这样能实现单独对其中任意一个Core进行数据更新或重新加载等的操作,为他们配置不同的域及其他配置参数,而互不干扰且方便维护。其次,分成多个Core可以减少单个Core的索引体积大小,这样也影响了你配置Solr.
两个数据是不是要分成两个core分开存放?
要综合考虑。比如你有课程表和分数表数据,你需要从以下几个方面来考虑:
1)你的系统是否明确划分为课程和分数管理两个模块。
2)是否有这样一个场景:你需要返回课程和分数两个类型的全部数据?因为跨Core Join查询会损耗性能,这部分损耗你是否可以接受?
3)每个类型索引数据的更新频率一致吗?如果两者其中一个几乎不更新,而另一个经常更新,更新频率不一致,自然不适合混合在一起存为单个Core。
4)两者数据是否明确做权限划分,即可能希望课程表数据对于A应用可见,而对于B应用不可见,那你最好是分Core存放。
5)分成多个Core来存放,带来索引数据维护的复杂度,但分成单Core带来索引体积增大,单次索引重建耗时会加长。
为什么要设计多Core?
·重建索引;
·配置变更影响最小化;
·索引合并和分裂;
·Core热交换。
solr与关系型数据库的区别:
数据库里有简单的基于通配符的文本模糊查询,但这会导致全表扫描,性能很差,而Solr是把搜索关键字保存在一个倒排表里,搜索性能提高了N个数量级。但Solr创建索引速度相对较慢。
Solr里更新部分字段(域)数据相对较慢,因为Solr里更新只能先删除再新增。而且在新增数据的可见性方面,数据库能立马可见,Solr近实时查询的数据可见性则稍差些。
Solr的魅力在于它灵活的Schema机制,由于Schema.xml约束比较宽松,你甚至可以认为Solr的Schema.xml只是个摆设,每个Document可以有任意个任意类型的域,而数据库里的表的字段是提前限定的,且每一行记录拥有的字段数必须一致。
配置文件
schema.xml:主要用来定义你索引数据需要的域和域类型,即你需要在这里声明索引数据中需要哪些域以及每个域的类型(域类型决定了被该类型修饰的域的域值该如何被索引、如何被分词、如何被存储等)
solrconfig.xml:主要用来配置索引创建、查询、Solr缓存以及Solr组件处理器等信息。
以stopwords.txt:自定义的停用词字典文件
synonyms.txt:自定义的同义词字典文件
data目录:主要用来存放你的索引数据和Solr日志文件
DIH
大多数的应用程序将数据存储在关系数据库、xml文件中。对这样的数据进行搜索是很常见的应用。DIH(Data Import Handler)提供了一种可配置的方式向Solr中导入数据,可以一次性全量导入,也可以增量导入。
通过Solr后台的Documents添加界面去添加索引,由于只能单个Document添加,效率太低。可能你的索引数据全都保存在文本文件里,比如txt文件,那么,如何批量去索引某个文件夹下的文本文件呢?Solr的Web后台其实提供了数据导入功能简称DIH。
开始之前,你需要了解DIH能帮你做些什么:
1)它能读取数据库的数据并创建索引;
2)它能够基于配置的方式把数据里表的列甚至多个表的数据聚合并解析成一个Document;
3)它支持基于配置的全量和增量数据导入;
4)它能实现基于配置的定时全量和增量索引;
5)它能基于HTTP方式读取并索引XML文件;
6)它支持各种基于插件式的datasource和formate配置。
Tika
有时候我们需要索引的数据可能存在于PDF、Word、Excel等文件中,我们需要去解析文件从中获取数据然后建立索引,而在Solr中这类文件解析工作由Tika负责。Tika将诸如PDF、Word、Excel的文件统一抽象为富文本文件,然后定义一套接口去提取它们的内容。使用者可直接调用该接口,而不用考虑文件类型以及不同类型文件的提取过程。
全量索引
所谓全量索引一般指的是每次从数据库中读取需要导入的全部数据,然后提交到Solr Server,最后删除指定Core的所有索引数据进行重建。全量导入一般在数据首次导入或者备份数据恢复时执行。
增量索引
当索引数据量很大时,每次都依靠全量导入数据显然很不切实际,所以增量导入索引数据显得格外重要。
当增量导入操作被执行,它会读取存储在conf/deltaimport.properties配置文件,利用配置文件里记录的上一次操作时间来运行增量查询,增量导入完成后,会更新conf/deltaimport.properties配置文件里的上一次操作时间戳。首次执行增量导入时,若conf/deltaimport.properties配置文件不存在,会自动新建。
如果要使用增量导入,前提你的表必须有两个字段:一个是删除标志字段即逻辑删除标志:isdeleted,另一个则是数据创建时间字段:create_date,字段名称不一定非得是isdeleted和create_date,但必须要包含两个表示该含义的字段。根据数据创建时间跟上一次增量导入操作时间一比对,就可以通过SQL语句查询出需要增量导入的数据,根据isdeleted字段可以查询出被标记为删除的数据,这些数据的ID主键需要传递给Solr,这样Solr就能同步删除索引中相关Document,实现数据增量更新。如果你数据表里的数据都是物理删除,没有逻辑删除标志位字段的话,那么找出已经被删除的数据显得比较困难,所以这就是需要逻辑删除标志字段的原因。
Lucene索引原理名词
索引:·在Lucene中一个索引是放在一个文件夹中的,一个索引就是多个Document的集合。