什么是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学习速成之配置文件的更多相关文章
-
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 ...
-
13.solr学习速成之IK分词器
IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...
-
12.solr学习速成之dataimport
solr除了利用solrj建立索引外,还可以由列式数据库hbase触发器添加索引,自动全量或者增量索引关系数据库数据等. dataimport可以配置从任何关系数据库导入索引 1.将jar包拷贝到to ...
-
11.solr学习速成之MoreLikeThis
Solr相似匹配 在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...
-
10.solr学习速成之高亮显示
Solr高亮显示的三种实现 高亮显示在搜索中使用的比较多,比较常用的有三种使用方式,如果要对某field做高亮显示,必须对该field设置stored=true . 第一种是普通的高 ...
-
9.solr学习速成之group
Group与Facet的区别 facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索. group则类似于关系数据库的g ...
-
8.solr学习速成之FacetPivot
什么是Facet.pivot Facet.pivot就是按照多个维度进行分组查询,是Facet的加强,在实际运用中经常用到,一个典型的例子就是商品目录树 NamedList解释: NamedList ...
-
7.solr学习速成之facet
Facet 介绍 Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计. 比如你上淘宝, ...
-
6.solr学习速成之multicore查询
查询关联多个core 再新建一个core 向每个core添加索引,修改 final static String SOLR_URL = "http://localhost:8080/solr/ ...
随机推荐
-
jqgrid学习笔记(转载)
jqgrid中文帮助文档网址:http://blog.mn886.net/jqGrid/ jqgrid:用来做什么? jqgrid是web端前台表格控件,用它可以轻松将数据格式化显示,前后台用过aja ...
-
(转)hbase master挂掉-zookeeper连接超时原因
link:http://www.51testing.com/?uid-445759-action-viewspace-itemid-812467 并行运行hbase删表,建表操作,多个表多个regio ...
-
数据库之mysql存储程序
什么时候会用到存储过程 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度2.当对数据库进行复杂操作时 ...
-
深入js隐式类型转换
前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...
-
Java Design Pattern(Factory,Singleton,Prototype,Proxy)
一.Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式可以做到把创建对象单独 ...
-
Web大前端面试题-Day11
86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...
-
ES6,新增数据结构Map的用法
Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成 ...
-
JS 字符串 作为变量名
function initCKEditor(querySelector,content_val,myEditor) { ClassicEditor.create(document.querySelec ...
-
scrapy微信爬虫使用总结
scrapy+selenium+Chrome+微信公众号爬虫 概述 1.微信公众号爬虫思路: 参考:记一次微信公众号爬虫的经历 2.scrapy框架图 3.scrapy经典教程 参考: python ...
-
【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...