一 基本说明

简单来说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基础知识的更多相关文章

  1. swift 学习(二)基础知识 (函数,闭包,ARC,柯里化,反射)

    函数 func x(a:Int, b:Int)  {}   func x(a:Int, b:Int) -> Void {}  func x(a:Int, b:Int) ->(Int,Int ...

  2. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  3. VBS学习日记(二) 基础知识

    VBScript 基础知识 一.变量 1.全部单引號后面的内容都被解释为凝视.(在vbsedit中ctrl+m凝视,反凝视ctrl+shift+m) 2.在 VBScript 中,变量的命名规则遵循标 ...

  4. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  5. ERP-非财务人员的财务培训教(一.二)------财务基础知识

    二.基本财务管理知识 第一节 财务管理基础知识(一) 财务与会计的关系 会计的基础知识 (一) 财务与会计的关系 财务与会计的内涵 1.会计 会计工作主要是解决三个环节的问题: 会计凭证 会计账簿 会 ...

  6. Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

    学习Solr前需要有Lucene的基础 Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html 1.部署Solr到Tomcat(Wind ...

  7. 学习 FPGA之前的基础知识

    在学习一门技术之前往往应该从它的编程语言入手,比如学习单片机时,往往从汇编或者C语言入门.所以不少开始接触FPGA的开发人员,往往是从VHDL或者Verilog开始入手学习的.但小编认为,若能先结合& ...

  8. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  9. Web学习篇之---html基础知识(一)

    html基础知识(一) 本篇文章主要介绍HTML头部所包括的信息. 一.下面都是在标签<head>...</head>之间的内容: 1.<title>-</t ...

随机推荐

  1. 如何修改magento产品详细页面的栏目

    magento默认模板里面的产品信息页面的布局是以两栏带右侧栏显示的,那么如何修改为两栏带左侧栏或者三栏.一栏的方式显示呢?下面教大家一种很简单的方法就可以实现.下面是默认的布局预览:

  2. 关于前端的margin

    margin 边界,元素周围生成额外的空白区.“空白区”通常是指其他元素不能出现且父元素背景可见的区域.——CSS权威指南 我比较喜欢使用“外边距”这个词来解释margin(同理padding可以称之 ...

  3. android 自动拨打电话 挂断电话代码

    页面布局文件代码  (  res下面的layout下面的activity_main.xml代码 ) <RelativeLayout xmlns:android="http://sche ...

  4. hdu2073-2078

    hdu2073 数学 #include<stdio.h> #include<math.h> double len(double x){ )*(x+)); } int main( ...

  5. Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)

    一.(转自:https://blog.csdn.net/majinggogogo/article/details/72123185) 映射文件是以<mapper>作为根节点,在根节点中支持 ...

  6. IE7下对某些seajs压缩文件不兼容的解决方法

    seajs.config({ comboExcludes: /common.js/ }) (杨磊哥提供)

  7. 几本不错的graphql 电子书

    当前专门讲graphql 的数据不是很多,但是越来越多的graphql 项目的出现以及graphql 自身的 便捷,老外已经有人去写graphql 的设计以及基本使用了. ebooks 地址 http ...

  8. FastAdmin composer json 版本说明

    来源于 FastAdmin 执行 composer update 后将 ThinkPHP 升级到了 V5.1. FastAdmin  是基于 ThinkPHP 5.0.x 开发的,而 ThinkPHP ...

  9. 修改 input 框输入光标的样式

    input, textarea { font-size: 24px; padding: 10px; color: red; text-shadow: 0px 0px 0px #000; -webkit ...

  10. listener does not currently know of 。。。。

    打开Oracle的 listener.ora 文件: (../oracle/product/10.2.0/db_1/network/admin/listener.ora) 设置环境变量: Oracle ...