Solr详解
1. Solr 是什么?
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。Solr的特性包括:
-
高级的全文搜索功能
-
专为高通量的网络流量进行的优化
-
基于开放接口(XML和HTTP)的标准
-
综合的HTML管理界面
-
可伸缩性-能够有效地复制到另外一个Solr搜索服务器
-
使用XML配置达到灵活性和适配性
-
可扩展的插件体系
2. Lucene 是什么?
Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能,是目前最为流行的基于Java开源全文检索工具包。目前已经有很多应用程序的搜索功能是基于 Lucene ,比如Eclipse 帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。
3. Solr vs Lucene
Solr与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。所以说,一句话概括 Solr:
Solr是Lucene面向企业搜索应用的扩展。
4.solr和Elasticsearch的比较
Solr优点
1.Solr有一个更大、更成熟的用户、开发和贡献者社区。
2.支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
3.Solr比较成熟、稳定。
4.不考虑建索引的同时进行搜索,速度更快。
缺点
建立索引时,搜索效率下降,实时索引搜索效率不高。
Elasticsearch优点
1.Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
2.Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
3.处理多租户不需要特殊配置,而Solr则需要更多的高级设置。
4.Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
5.各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
缺点
1.只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
2.还不够自动(不适合当前新的Index Warmup API)
Elasticsearch 与 Solr 的比较总结
1.Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
2.Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
3.Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
4.Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
5.Solr 在传统的搜索应用中表现好于 Elasticsearch,但处理实时搜索应用时效率低于 Elasticsearch。
6.Solr建立索引时候,搜索效率下降,实时搜索效率不高,es实时搜索效率高
通过这些优缺点的比较选择solr最主要原因是:
1.我们的项目中dubbox要用到zookeeper作为注册中心,刚好可以利用zookeeper来协调Solr集群;
2.如果不在实时插入查询,solr搜索引擎的暂时可以满足搜索的速度需求;
3.项目后期升级要朝着hadoop这块发展,当数据量大的时候,用hadoop处理数据,而solr可以很简便的与hadoop结合。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息;不仅限于搜索,Solr也可以用于存储目的;
4.还有最后一个原因,solr有一个成熟的社区,我们在开发中遇到的问题 ,可以向社区求助,以便使我们更快的解决问题;
Solr面试问题
solr如何实现搜索的?
倒排索引(倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。),先抽取文档中词,并建立词与文档id的映射关系,然后查询的时候会根据词去查询文档id,并查询出文档。
solr怎么设置搜索结果排名靠前
设置文档中域的boost值,值越高相关性越高,排名就靠前。
IK分词器原理
本质上是词典分词,在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有词语拆分出来的过程。
solr的索引查询为什么比数据库要快
Solr使用的是Lucene API实现的全文检索。全文检索本质上是查询的索引。而数据库中并不是所有的字段都建立的索引,更何况如果使用like查询时很大的可能是不使用索引,所以使用solr查询时要比查数据库快
多张表的数据导入solr(解决id冲突)
在schema.xml中添加uuid,然后solrconfig那边修改update的部分,改为使用uuid生成。
solr多条件组合查询
创建多个查询对象,指定他们的组合关系,Occur.MUST(必须满足and),Occur.SHOULD(应该满足or),Occur.MUST_NOT(必须不满足not)。