Solr学习之二-Solr基础知识

一 基本说明

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

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

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

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

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

与Lucene的区别是:Lucene是一些类API是个工具包,通过这些API我们可以创建索引/通过索引查询;而Solr是在此基础上的封装,通过简单的配置

就可以直接使用的开源搜索服务器。

二  基本概念

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

在Solr中索引涉及到的概念有:

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

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

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

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

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

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

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

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

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

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

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

7、文档: 在Solr中建立索引是通过文档添加的方式进行,如果将索引看成一张表,那么文档可以看成是一条记录,那么Schema.xml可以看成这个表的定义。

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

比如:    标示定义一个字段为string类型,名称为:subAcctName

是被索引的,而且是存储的。当然也可以通过一种叫动态定义的方法进行字段的模糊匹配,比如 就表示所有以_i结尾的字段都当成int来处理。

注意这里面的类型不同于java的类型,只是相似,对于每个类型,solr会定义其相关的处理规则等。比如:

标示string类型,对应的类为StrField类,如果缺失这个字段,默认在搜索的时候是排在最后的。

Schema.xml 在定义文档的字段时候会定义一个唯一值字段,似于表的主键,形如: id,作用是用于在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上,这个字段设置为shard1、shard2等。

3) 在建collection的时候路由器设置为:implicit方式,在建索引的时候,文档添加一个_route_字段,值为:shard1、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格式添加,内容类似:

05991

Peter Parker

Spider-Man

superhero

agility

spider-sense

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

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

域有几个非常重要的属性:

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

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

我们通过查询到的ID,再到其他存储中,比如数据库中把对应的这个字段信息再抽出来。

域中有个特殊的域叫拷贝域,它的作用是,可以将其他域的值拷贝到这个域中,搜索的时候只要搜索这个域就可以了。

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

9、段(Segment)

多个段组成索引,一个段由多个文件组成,新添加的文档可以生产新的段,不同的段之间可以合并。

在index目录下以相同数字的文件开头的属于一个段.

segments.gen和segments_* 属于段的元数据信息,保存段的基本属性。

10、词(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                      保存了倒排表中每个词在包含此词的文档中的位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容