Solr --- 入门简介

一、Solr简介

Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 


Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr索引的实现方法很简单,用POST方法向 Solr服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET请求,然后对Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。


二、Solr优点

  • 高级的全文搜索功能
  • 专为高通量的网络流量进行的优化
  • 基于开放接口(XML和HTTP)的标准
  • 综合的HTML管理界面
  • 可伸缩性-能够有效地复制到另外一个Solr搜索服务器
  • 使用XML配置达到灵活性和适配性
  • 可扩展的插件体系


三、Solr VS Lucene

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。



四、Solr中的基本概念

4.1、Core

在Solr的单节点部署或者Master-Salve方式部署下标示一个完整索引。Core都是由多个文件组成,建立索引的时候是先分段,然后再合并的方式。一个Solr可以包含一个或多个Core,每个Core的配置可以不同;在SolrCoud部署下标示索引的一部分。


4.2、Collection

在SolrCould部署模式下,指的是一个索引的逻辑概念。可以把Solr中的Core或Collection看做一个Oracle的实例。一个SolrCould可以包含多个Collection。

一个Collection可以切分成多个Shard,切分的数量大小和机器节点数和副本数有关系,要求shard数量*副本数<节点数*numShards 。注意一个节点标示启动一个HTTP服务器,

一台机器可以起多个Solr节点(这种情况必须设置不同的端口),一个Collection的内容是由每个shard中的信息组成。一个shard的信息对应组成它的一个副本的信息。

4.3、Shard

标示切片,在SolrColud 部署模式下,将一个逻辑索引Collection切割成多个分片, 每个Shard是由多个副本Replica组成。

4.4、Replica

副本。多个副本组成一个Shard、注意一个Shard中的replica 包含的内容逻辑上应该是一样的,Shard的数据只是其中一份Replica,不是这些副本的组合。这些副本中有一个副本会被选择为Leader,负责写索引。

4.5、Zookeeper

另外一个开源的软件,在solrCloud部署模式下是必须的,主要作用是:

(1)配置的统一存储和分发

(2)shard中副本的Leader的选取

(3)负责监控集群状态,发生改变时候通知相关的监听器,比如挂了一台机器,这台机器上如果有shard的leader节点,剩余的同一个shard的其他副本会竞选Leader,且solrColud会知道这台机器挂掉,在处理请求的时候就不发请求给这台机器。


4.6、Config Set

配置组,存储配置信息,每个Collection都有,至少包含solrconfig.xml这个是配置这个collection基本配置,比如使用的Lucene的版本、使用的查询组件、缓存相关信息等;还必须包含Schema.Xml 这个配置文件配置的是Collection存在的文档的字段,包括字段的类型,是否需要存储,是否需要分词等。

4.7、Document

在Solr中建立索引是通过文档添加的方式进行,如果将索引看成一张表,那么Document可以看成是一条记录,那么Schema.xml可以看成这个表的定义。
一个文档由多个字段定义,这些是在Schema.xml中定义的,不是所有定义的字段文档中都必须有,但是反过来文档中有的字段必须在Schema.xml中定义,

比如:   <field name="subAcctName" type="string" indexed="true" stored="true" /> 标示定义一个字段为string类型,名称为:subAcctName,indexed=true表示是被索引的,stored=true表示是存储的。当然也可以通过一种叫动态定义的方法进行字段的模糊匹配,比如 <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>就表示所有以_i结尾的字段都当成int来处理。

注意这里面的类型不同于java的类型,只是相似,对于每个类型,solr会定义其相关的处理规则等。比如:
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
标示string类型,对应的类为StrField类,如果缺失这个字段,默认在搜索的时候是排在最后的。

Schema.xml 在定义文档的字段时候会定义一个唯一值字段,似于表的主键,形如: <uniqueKey>id</uniqueKey>,作用是用于在solrCloud模式下进行路由,Solr通过一定的算法对每个文档的ID进行计算,得到的一个Hash值,然后看下这个Hash值是属于哪个shard,就把文档发到哪个shard上去。通过这个算法可以保证shard之间数量的均衡,在建索引可以起到负载均衡的作用。


如果你要制定文档存储的shard,有三个办法:

  • 通过特殊的ID,这个ID必须有两部分组成,两部分之间用!号分隔,solr在计算hash的时候,会利用!前面的16bit做hash,并且利用后面16个bit做hash,然后把它组合起来,这样可以保证这类文档都发到特定的shard上,注意这个特定的shard上,而不知道是具体是哪一个shard上。
  • 通过_shard_字段来指定具体的shard上,这个字段设置为shard1、shard2等。
  • 在建collection的时候路由器设置为:implicit方式,在建索引的时候,文档添加一个_route_字段,值为:shard1、shard2等。

4.8、域(Field)

类似于数据库表的字段,有类型,有处理方式。注意我在Solr学习之一讲的倒排索引中的词典中的词不同于字段。域只有指明被索引后,然后被分词器进行分词(在solr中string等基本类型是不会被分词的,text类型标示复杂类型,需要分词),之后才会存储在词典中

域有几个非常重要的属性:
indexed: 标示是否被索引,简单来说,只有被索引的字段,在查询时候才可以通过这个字段的值进行匹配查询。
stored:   如果这个设置为true标示在索引中也存储这个字段信息;如果不存在这个信息,这查询的结果中不会显示,这适用于内容非常多的场景,我们通过查询到的ID,再到其他存储中,比如数据库中把对应的这个字段信息再抽出来。

域中有个特殊的域叫拷贝域,它的作用是,可以将其他域的值拷贝到这个域中,搜索的时候只要搜索这个域就可以了。
<copyField source="title" dest="text"/>
<copyField source="content" dest="text"/>
将域title和content内容拷贝到text域里面。

4.9、段(Segment)
多个段组成索引,一个段由多个文件组成,新添加的文档可以生产新的段,不同的段之间可以合并。在index目录下以相同数字的文件开头的属于一个段.
segments.gen和segments_* 属于段的元数据信息,保存段的基本属性。


4.10、词(Term)
第一部分介绍组成词典的部分,是词法分析语法分析后得到的字符串。
term由一对值组成:field name(string)和field value(bytes),同一个value在不同的field中有不同的含义。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值