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中定义,
比如: <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上,这个字段设置为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格式添加,内容类似:
<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>
8、域(Field):类似于数据库表的字段,有类型,有处理方式。注意我在Solr学习之一讲的倒排索引中的词典中的词不同于字段。
域只有指明被索引后,然后被分词器进行分词(在solr中string等基本类型是不会被分词的,text类型标示复杂类型,需要分词),之后才会存储在词典中
域有几个非常重要的属性:
indexed: 标示是否被索引,简单来说,只有被索引的字段,在查询时候才可以通过这个字段的值进行匹配查询。
stored: 如果这个设置为true标示在索引中也存储这个字段信息;如果不存在这个信息,这查询的结果中不会显示,这适用于内容非常多的场景,
我们通过查询到的ID,再到其他存储中,比如数据库中把对应的这个字段信息再抽出来。
域中有个特殊的域叫拷贝域,它的作用是,可以将其他域的值拷贝到这个域中,搜索的时候只要搜索这个域就可以了。
<copyField source="title" dest="text"/>
<copyField source="content" dest="text"/>
将域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 保存了倒排表中每个词在包含此词的文档中的位置。
Solr学习之二-Solr基础知识的更多相关文章
- swift 学习(二)基础知识 (函数,闭包,ARC,柯里化,反射)
函数 func x(a:Int, b:Int) {} func x(a:Int, b:Int) -> Void {} func x(a:Int, b:Int) ->(Int,Int ...
- ios开发学习笔记001-C语言基础知识
先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...
- VBS学习日记(二) 基础知识
VBScript 基础知识 一.变量 1.全部单引號后面的内容都被解释为凝视.(在vbsedit中ctrl+m凝视,反凝视ctrl+shift+m) 2.在 VBScript 中,变量的命名规则遵循标 ...
- 学习android学习必备的java基础知识--四大内部类
学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...
- ERP-非财务人员的财务培训教(一.二)------财务基础知识
二.基本财务管理知识 第一节 财务管理基础知识(一) 财务与会计的关系 会计的基础知识 (一) 财务与会计的关系 财务与会计的内涵 1.会计 会计工作主要是解决三个环节的问题: 会计凭证 会计账簿 会 ...
- Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用
学习Solr前需要有Lucene的基础 Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html 1.部署Solr到Tomcat(Wind ...
- 学习 FPGA之前的基础知识
在学习一门技术之前往往应该从它的编程语言入手,比如学习单片机时,往往从汇编或者C语言入门.所以不少开始接触FPGA的开发人员,往往是从VHDL或者Verilog开始入手学习的.但小编认为,若能先结合& ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Web学习篇之---html基础知识(一)
html基础知识(一) 本篇文章主要介绍HTML头部所包括的信息. 一.下面都是在标签<head>...</head>之间的内容: 1.<title>-</t ...
随机推荐
- Linux下你需要了解的10个网络和监控命令
我下面列出来的10个基础的每个linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nsloo ...
- 51Nod 1091:线段的重叠(贪心)
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 ...
- HTML5和CSS3阶段,我是如何学习的?
经过一个月的学习,我收获了许多,今天的测验是做一个企业中文网站,令我自己感到吃惊的是,我前前后后用了4个小时就完成了,这在一个月前根本不可能,因为对布局属性的理解还不够深刻,常常会在调试中浪费大量时间 ...
- maven quick start
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-a ...
- javascript : location 对象
window.location: window的location对象 window.location.href 整个URl字符串(在浏览器中就是完整的地址栏) window.location.prot ...
- 枚举大小为k的子集
这种位操作不大可能分析出来,先看代码再分析. 代码 使用条件:\(k>0\) void solve(int n,int k) { for(int comb = (1 << k) - ...
- day25 python学习 继承,钻石继承
通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' def __init__(s ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- Netflix 是怎样的一家公司?为什么它在美国非常成功
https://www.zhihu.com/question/19552101 作者:陈达链接:https://www.zhihu.com/question/19552101/answer/11486 ...
- 用Qstring给char[]数组赋值(转)
tree_data.Desc //Desc是char[80]类型的数据 Qstring newDescStr; strcpy(tree_data.Desc , newDescStr.toLocal8 ...