什么是solr

  Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果

solr的特点

  Solr是一个高性能,采用Java开发,Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎.文档通过Http利用XML 加到一个搜索集合中。Solr查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

什么是Lucene?

  Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。所以说,一句话概括Solr: Solr是Lucene面向企业搜索应用的扩展。

Solr服务原理

  Solr对外提供标准的http接口来实现对数据的索引的增加、删除,修改,查询。在Solr中,用户通过向部署在servlet 容器中的Solr Web应用程序发送 HTTP 请求来启动索引和搜索。Solr接受请求,确定要使用的适当SolrRequestHandler,然后处理请求。通过 HTTP 以同样的方式返回响应。默认配置返回Solr的标准 XML 响应,也可以配置Solr的备用响应格式。

配置文件schema.xml

schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储,是否标准化即 Norms ,是否存储项向量等等。

schema.xml下有两个标签 field和fieldType,field定义域,fieldType定义域类型

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 

name表示域名称 必须有

type表示域类型的名称,与fieldType元素的name属性值对应,必须有

indexed true表示需要对该域进行索引,一般当你需要在该域上进行查询或排序时,则需要配置为true,默认false

stored 是否需要把值存储到硬盘上,方便你后续查询时,能再次提取出来原样显示给客户

docValues 表示此域是否需要添加一个docValues域,这对facet查询,group分组,排序,function查询有好处,尽管这个属性

不是必须的,但他能加快索引数据加载,对NRT近实时搜索比较好,且更节省内存, 但他也有一些限制,比如当前

docValues域只支持strField,UUIDField Trie*Field等域,且要求域的域值是单值不能是多域值

multiValued 表示这个域是否可以存储多个值,若设置为true,即表示这是一个多值域

omitNorms 此属性若设置为true,即表示将忽略域值的长度标准化,忽略在索引过程中对当前域的权重设置,且会节省内存

,只有全文本域或者你需要在索引创建过程中设置域的权重时才需要把这个值设为false,对于基本数据类型且不可

分词的域如,intField.longField,StrField等默认属性值就是true,否则默认就是false.

termVectors 设置为true即表示需要为该field存储项向量信息,当你需要MoreLikeThis功能时,则需要将此属性值设为true

这样会带来一些性能提升

termPositions 是否存储Term的起始位置信息,,这会增加索引的体积,但高亮度功能需要依赖此项设置否则无法高亮

termOffsets 表示是否存储索引的位置偏移量,高亮功能需要此项配置,当你使用SpanQuery时,此项配置会影响匹配的结果集

field里还有两个比较难理解的域,是Solr扩展的,在Lucene中没有的概念,即dynamicField

动态域和copyField复制域

  动态域的属性配置跟普通的field差不多,区别就是name的属性值,可以使用通配符,这样就可以模糊匹配多个域啦遮掩设计的目的就是不用频繁的去修改schema.xml中的field配置去增加field域啦,比如之前有个link_s域,某一天你想再增加一个url_s域,那你就需要去修改schema.xml配置文件,由于schema.xml修改过后需要重启tomcat才能生效,重启即意味着程序的中断,这往往是不可接受的所以引入动态域来避免频繁的添加修改域,但前提是你的域需要符合你提前定义的动态域的域名称命名规则

  复制域即表示把某个域的值复制到另一个目标域上面,那如果把多个域的值复制到一个目标域上面,你可以进行多次复制,体现到xml配置上就是类似这样的配置:

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

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

如上配置就是表示把title和body这两个域的值全部复制到text这个新域上面要注意的是,如果只是复制单个域,那么如果你被复制域本身就是多值域,那么目标域也是多值域,这毋容置疑,那如果你复制的域是多个域,只要其中有一个域是多值域,那么目标域就一定是多值域.

配置文件solrconfig

solrconfig.xml配置包含了很多solr自身配置相关的参数,分为以下几块

1.依赖的lucene版本配置,这决定了你创建的lucene索引结构,因为lucene各版本之间的索引结构并不是完全兼容的

<luceneMatchVersion>5.3.1</luceneMatchVersion>

2.索引创建相关的配置,如索引目录,IndexWriterConfig类中的相关配置(它决定了你的索引创建性能)

<filter class="solr.LimitTokenCountFilterFactory"

maxTokenCount="10000"/><writeLockTimeout>1000</writeLockTimeout>
maxTokenCount即在对某个域分词的时候,最多只提取前10000个Token,后续的域值将被抛弃

writeLockTimeout表示IndexWriter实例在获取写锁的时候最大等待超时时间,超过指定的超时时间仍未获取

到写锁,则indexWriter写索引操作将会抛出异常

<maxIndexingThreads>8<maxIndexingThreads>

表示创建索引的最大线程数,默认是开辟8个线程开创建索引

<ramBufferSizeMB>100</ramBufferSizeMB>

表示创建索引时内存缓存大小,单位是MB,默认最大是100MB

<ramBufferedDocs>1000</ramBufferedDocs>

表示在document写入硬盘之前,缓存的document最大个数,超过这个最大值会触发索引的flush操作

3.solrconfig.xml中依赖的外部jar包加载路径配置

如:

<lib dir="./lib" regex="lucene-\w+\.jar"/>

这里的dir表示一个jar包目录路径,该目录路径是相对于你当前core根目录的;regex表示一个正则表达式,是用来过滤文件名的.

<dataDir>${solr.data.dir:}</dataDir>

如果solr_home下不存在core的话,那dataDir默认就是相对于solr_home

4.缓存相关配置,缓存包括过滤器缓存,查询结果集缓存,Document缓存,以及自定义缓存等

 <filterCache class="solr.FastLRUCache"

                 size="512"

                 initialSize="512"

                 autowarmCount="0"/>

用来配置filter过滤器的缓存相关的参数

  <queryResultCache class="solr.LRUCache"

                     size="512"

                     initialSize="512"

                     autowarmCount="0"/>

用来配置对Query返回的查询结果集即TopDocs的缓存

<documentCache class="solr.LRUCache"

                   size="512"

                   initialSize="512"

                   autowarmCount="0"/>

用来配置对Document中存储域的缓存,因为每次从硬盘上加载存储域的值

都是很昂贵的操作,这里说的存储域指的是那些store.YES的Field.

6.updateHandler配置即索引更新操作相关配置

<updateHandler class="solr.DirectUpdateHandler2">

指定索引更新操作处理类,directUpdateHandler2是一个高性能的索引更新处理类,它支持软提交

<updateLog>

  <str name="dir">${solr.ulog.dir:}</str>

</updateLog>

设置索引库更新日志.默认路径为solr_home下面的data/tlog

 <autoCommit> 

   <maxTime>15000</maxTime> 

   <maxDocs>10000</maxDocs>

   <openSearcher>false</openSearcher> 

 </autoCommit>

自动赢提交方式:

maxTime;设置多长时间提交一次

maxDocs;设置达到多少文档提交一次

openSearcher;文档提交后是否开启新的searcher,如果false,文档只是提交到index

索引库,搜索结果中搜不到此次提交的文档如果true,既提交到index索引库,也能在搜索结果

中搜索到此次提交的内容

7.requestHandler相关配置,即接受客户端http请求的处理类配置,输入的请求会通过请求中的路径被转发到特定的处理器

 <requestHandler name="/query" class="solr.SearchHandler">

     <lst name="defaults">

       <str name="echoParams">explicit</str>

       <str name="wt">json</str>

       <str name="indent">true</str>

     </lst>

  </requestHandler>

这个requestHandler配置的是请求URL  /query跟请求处理类SearcherHandler之间的一个映射关系

,即你访问http://localhost:8080/solr/coreName/query?q=xxx时,会交给SearcherHandler类来处理这个http请求,

你可以配置一些参数来干预SearcherHandler处理细节,

比如echoParams表示是否打印HTTP请求参数,wt即writer type,即返回的数据的MIME类型,如json,xml等等,

indent表示返回的json或者XML数据是否需要缩进,否则返回的数据没有缩进也没有换行,不利于阅读

1.solr学习速成之配置文件的更多相关文章

  1. 2.solr学习速成之安装

    1.下载解压solr-5.3.1.tgz [root@205 opt]# tar -zxf solr-5.3.1.tgz -C /opt/module/ 2.将solr-5.3.1/server/so ...

  2. 13.solr学习速成之IK分词器

    IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...

  3. 12.solr学习速成之dataimport

    solr除了利用solrj建立索引外,还可以由列式数据库hbase触发器添加索引,自动全量或者增量索引关系数据库数据等. dataimport可以配置从任何关系数据库导入索引 1.将jar包拷贝到to ...

  4. 11.solr学习速成之MoreLikeThis

    Solr相似匹配    在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...

  5. 10.solr学习速成之高亮显示

    Solr高亮显示的三种实现 高亮显示在搜索中使用的比较多,比较常用的有三种使用方式,如果要对某field做高亮显示,必须对该field设置stored=true .          第一种是普通的高 ...

  6. 9.solr学习速成之group

    Group与Facet的区别  facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索.        group则类似于关系数据库的g ...

  7. 8.solr学习速成之FacetPivot

    什么是Facet.pivot  Facet.pivot就是按照多个维度进行分组查询,是Facet的加强,在实际运用中经常用到,一个典型的例子就是商品目录树 NamedList解释: NamedList ...

  8. 7.solr学习速成之facet

    Facet 介绍   Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计.        比如你上淘宝, ...

  9. 6.solr学习速成之multicore查询

    查询关联多个core 再新建一个core 向每个core添加索引,修改 final static String SOLR_URL = "http://localhost:8080/solr/ ...

随机推荐

  1. day4-不同目录间模块的调用

    1.前言 上文已经讲述了软件项目开发目录规范的若干事项,现在问题来了,我们遵循了项目目录设计规范,不同目录下设计了不同的函数和模块,怎么实现对这些模块的调用,使其为项目整体所用呢?本章节讲述的绝对路径 ...

  2. 【spark】常用转换操作:join

    join就表示内连接. 对于内链接,对于给定的两个输入数据集(k,v1)和(k,v2) 根据相同的k进行连接,最终得到(k,(v1,v2))的数据集. 示例 val arr1 = Array((&qu ...

  3. js & jquery数组介绍

    (转自:http://www.jb51.net/article/30793.htm) 1.数组的创建 var arr=new Array(); 2.查找数组中的元素 for(var i=0;i< ...

  4. C#文件与文件夹操作

    (转自:http://www.csharpwin.com/csharpspace/6649r3960.shtml) C#文件操作:C#追加文件 StreamWriter sw = File.Appen ...

  5. jsp和servlet学习总结

    一.Jsp与servlet的区别: jsp是java代码嵌入html中,用java代码控制来html. Servlet完全是JAVA程序代码构成,用来流程控制和事务处理 jsp更擅长表现于页面显示,s ...

  6. js 取任意两个数之间的随机整数

    function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Mat ...

  7. QGrapicsScene类

    概述 QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的item ...

  8. POSIX线程同步

    在posix编程中,如果在不同的线程中几乎同一时间操作同一个变量的时候,就会出现不同步. 如何解决这样的问题,这里需要用到互斥量,互斥锁的概念.请看UNIX环境高级编程P299页 #include & ...

  9. mysql数据库( 基础篇加破解)

    1.数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库 2.什么是数据库:(用来存储数据的仓库) 数据库:(cs架构套接字) 数据库管理软件分类 ...

  10. linux中的vim编辑器的使用

    vim的三种模式: 常规模式(命令模式)也是默认模式,从其它模式进行命令模式按esc i 在光标前插入文本 o 命令是指在当前行下方插入新行 dd 是删除光标所在的整个一行 yy 是在光标所在整个放入 ...