Solr学习之二-Solr基础知识

一 基本说明

简单来讲Solr是基于Lucene的高性能的,开源的Java企业搜索服务器。Solr能够看做一个Web app,运行在tomcat或Jetty这类HTTP服务器上,java

底层是一个基于Lucene的搜索引擎,还附加一个Solr的基本管理界面。Solr提供HTTP服务,经过Get方法进行查询,经过Post方法进行索引的添加/删除管理。web

通常来讲Solr的查询时经过Get方法请求到HTTP服务器的solr这个app下的/select对应的servlet上去,而添加等操做时经过POST方法到HTTP服务器的算法

Solr这个app下的/update对应的servlet方法上去。数据库

Solr做为搜索引擎,提供基于切面/高亮/多种输出格式/复杂的语法搜索规则等功能。缓存

与Lucene的区别是:Lucene是一些类API是个工具包,经过这些API咱们能够建立索引/经过索引查询;而Solr是在此基础上的封装,经过简单的配置tomcat

就能够直接使用的开源搜索服务器。服务器

 

二  基本概念

在Solr学习一中了解到搜索引擎的核心是创建索引,而后利用索引进行搜索。app

在Solr中索引涉及到的概念有:负载均衡

1 、 Core     : 在Solr的单节点部署或者Master-Salve方式部署下标示一个完整索引。Core都是由多个文件组成,创建索引的时候是先分段,而后再合并的方式。ide

  一个Solr能够包含一个或多个Core,每一个Core的配置能够不一样;在SolrCoud部署下标示索引的一部分。

二、Collection: 在SolrCould部署模式下,指的是一个索引的逻辑概念。能够把Solr中的Core或Collection看作一个Oracle的实例。一个SolrCould能够包含多个Collection。

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

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

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

四、Replica  : 副本。多个副本组成一个Shard、注意一个Shard中的replica 包含的内容逻辑上应该是同样的,Shard的数据只是其中一份Replica,不是这些副本的组合。

这些副本中有一个副本会被选择为Leader,负责写索引。

五、Zookeeper:另一个开源的软件,在solrCloud部署模式下是必须的,主要做用是:

1)配置的统一存储和分发;2)shard中副本的Leader的选取;3)负责监控集群状态,发生改变时候通知相关的监听器,好比挂了一台机器,这台机器上若是有shard的leader节点,剩余的同一个shard的其余副本会竞选Leader,且solrColud会知道这台机器挂掉,在处理请求的时候就不发请求给这台机器。

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

七、文档: 在Solr中创建索引是经过文档添加的方式进行,若是将索引当作一张表,那么文档能够当作是一条记录,那么Schema.xml能够当作这个表的定义。

一个文档由多个字段定义,这些是在Schema.xml中定义的,不是全部定义的字段文档中都必须有,可是反过来文档中有的字段必须在Schema.xml中定义,

好比:   <field name="subAcctName" type="string" indexed="true" stored="true" /> 标示定义一个字段为string类型,名称为:subAcctName

是被索引的,并且是存储的。固然也能够经过一种叫动态定义的方法进行字段的模糊匹配,好比 <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,有三个办法:

1)经过特殊的ID,这个ID必须有两部分组成,两部分之间用!号分隔,solr在计算hash的时候,会利用!前面的16bit作hash,而且利用后面16个bit作hash,

而后把它组合起来,这样能够保证这类文档都发到特定的shard上,注意这个特定的shard上,而不知道是具体是哪个shard上。

2)经过_shard_字段来指定具体的shard上,这个字段设置为shard一、shard2等。

3) 在建collection的时候路由器设置为:implicit方式,在建索引的时候,文档添加一个_route_字段,值为:shard一、shard2等。

具体的语句举例: http://x.x.x.x:xxx/solr-5.0.0-web/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3

 

文档在添加时候,若是以xml格式添加,内容相似:

<add><doc>

  <field name=“id”>05991</field>

  <field name=“name”>Peter Parker</field>

  <field name=“supername”>Spider-Man</field>

  <field name=“category”>superhero</field>

  <field name=“powers”>agility</field>

  <field name=“powers”>spider-sense</field>

</doc></add>

八、域(Field):相似于数据库表的字段,有类型,有处理方式。注意我在Solr学习之一讲的倒排索引中的词典中的词不一样于字段。

域只有指明被索引后,而后被分词器进行分词(在solr中string等基本类型是不会被分词的,text类型标示复杂类型,须要分词),以后才会存储在词典中

域有几个很是重要的属性:

indexed: 标示是否被索引,简单来讲,只有被索引的字段,在查询时候才能够经过这个字段的值进行匹配查询。

stored:   若是这个设置为true标示在索引中也存储这个字段信息;若是不存在这个信息,这查询的结果中不会显示,这适用于内容很是多的场景,

咱们经过查询到的ID,再到其余存储中,好比数据库中把对应的这个字段信息再抽出来。

域中有个特殊的域叫拷贝域,它的做用是,能够将其余域的值拷贝到这个域中,搜索的时候只要搜索这个域就能够了。

<copyField source="title" dest="text"/>

<copyField source="content" dest="text"/>

 将域title和content内容拷贝到text域里面。

九、段(Segment)

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

十、词(Term)

     第一部分介绍组成词典的部分,是词法分析语法分析后获得的字符串。

     term由一对值组成:field name(string)和field value(bytes),同一个value在不一样的field中有不一样的含义。

 

文档、索引、字段、词之间的关系能够用下图描述:

《网上借来的图》

一个索引是由多个段组成,在实际中段是一些列文件,一个段又是由多个文档组成的,一个文档又是由多个字段组成。

段独立存在,做为一个子索引,能够被单独搜索。

一个字段中的内容通过分词变成Team 存储在倒排索引中。

 Lucene保存的索引信息,既包括正向信息又包含反向信息。

正向信息:按照从属关系:索引(Index) –> 段(segment) –> 文档(Document) –> 域(Field) –> 词(Term)

通常上层不光包含本身的信息还包含部分的下层信息。

保存正向信息的文件有:

  • segments_N                       保存了此索引包含多少个段,每一个段包含多少篇文档。
  • XXX.fnm                            保存了此段包含了多少个域,每一个域的名称及索引方式。
  • XXX.fdx,XXX.fdt               保存了此段包含的全部文档,每篇文档包含了多少域,每一个域保存了那些信息。
  • XXX.tvx,XXX.tvd,XXX.tvf 保存了此段包含多少文档,每篇文档包含了多少域,每一个域包含了多少词,每一个词的字符串,位置等信息。

反向信息:

      词典到索引的映射,也即咱们说的倒排索引。

  • XXX.tis,XXX.tii          保存了词典(Term Dictionary),也即此段包含的全部的词按字典顺序的排序。
  • XXX.frq                      保存了倒排表,也即包含每一个词的文档ID列表。
  • XXX.prx                      保存了倒排表中每一个词在包含此词的文档中的位置。
相关文章
相关标签/搜索