Solr调研总结.docx
《Solr调研总结.docx》由会员分享,可在线阅读,更多相关《Solr调研总结.docx(101页珍藏版)》请在冰豆网上搜索。
![Solr调研总结.docx](https://file1.bdocx.com/fileroot1/2022-12/11/50802c8b-c8d1-4033-b63a-32648cce1a34/50802c8b-c8d1-4033-b63a-32648cce1a341.gif)
Solr调研总结
1.Solr是什么?
Solr它是一种开放源码的、基于LuceneJava的搜索服务器,易于加入到Web应用程序中。
Solr提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT和JSON等格式)。
它易于安装和配置,而且附带了一个基于HTTP的管理界面。
可以使用Solr的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。
Solr的特性包括:
∙高级的全文搜索功能
∙专为高通量的网络流量进行的优化
∙基于开放接口(XML和HTTP)的标准
∙综合的HTML管理界面
∙可伸缩性-能够有效地复制到另外一个Solr搜索服务器
∙使用XML配置达到灵活性和适配性
∙可扩展的插件体系
2.Lucene是什么?
Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。
Lucene目前是ApacheJakarta(雅加达)家族中的一个开源项目。
也是目前最为流行的基于Java开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于Lucene,比如Eclipse帮助系统的搜索功能。
Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene就能对你的文档进行索引和搜索。
3.SolrvsLucene
Solr与Lucene并不是竞争对立关系,恰恰相反Solr依存于Lucene,因为Solr底层的核心技术是使用Lucene来实现的,Solr和Lucene的本质区别有以下三点:
搜索服务器,企业级和管理。
Lucene本质上是搜索库,不是独立的应用程序,而Solr是。
Lucene专注于搜索底层的建设,而Solr专注于企业应用。
Lucene不负责支撑搜索服务所必须的管理,而Solr负责。
所以说,一句话概括Solr:
Solr是Lucene面向企业搜索应用的扩展。
Solr与Lucene架构图:
Solr使用Lucene并且扩展了它!
∙一个真正的拥有动态字段(DynamicField)和唯一键(UniqueKey)的数据模式(DataSchema)
∙对Lucene查询语言的强大扩展!
∙支持对结果进行动态的分组和过滤
∙高级的,可配置的文本分析
∙高度可配置和可扩展的缓存机制
∙性能优化
∙支持通过XML进行外部配置
∙拥有一个管理界面
∙可监控的日志
∙支持高速增量式更新(FastincrementalUpdates)和快照发布(SnapshotDistribution)
4.搭建并调试Solr
4.1安装虚拟机
Solr必须运行在Java1.6或更高版本的Java虚拟机中,运行标准Solr服务只需要安装JRE即可,但如果需要扩展功能或编译源码则需要下载JDK来完成。
可以通过下面的地址下载所需JDK或JRE:
∙OpenJDK()
∙Sun()
∙IBM()
∙Oracle()
安装步骤请参考相应的帮助文档。
4.2下载Solr
本文针对Solr4.2版本进行调研的,下文介绍内容均针对Solr4.2版本,如与Solr最新版本有出入请以官方网站内容为准。
Solr官方网站下载地址:
http:
//lucene.apache.org/solr/
4.3下载并设置ApacheAnt
Solr是使用Ant进行管理的源码,Ant是一种基于Java的build工具。
理论上来说,它有些类似于Maven或者是C中的make。
下载后解压出来后,进行环境变量设置。
ANT_HOME:
E:
\Work\apache-ant\1.9.1(这里为你自己解压缩的目录)PATH:
%ANT_HOME%\bin(这个设置是为了方便在dos环境下操作)
查看是否安装成功,在命令行窗口中输入命令ant,若出现结果:
说明ant安装成功!
因为ant默认运行build.xml文件,这个文件需要我们建立。
现在就可以进行buildSolr源码了。
在命令行窗口中进入到你的Solr源码目录,输入ant会出现当前build.xml使用提示信息。
其它的先不用管它,我们只要针对我们使用的IDE进行build就行了,如果使用eclipse就在命令行输入:
anteclipse.如果使用IntelliJIDEA就在命令行输入:
antidea。
这样就能进行build了。
黑窗口里提示这个。
。
。
失败。
。
。
为什么呢,最后我发现是因为下载的ant中少了一个jar就是这apache-ivy(下载地址:
http:
//ant.apache.org/ivy/)这东东名子真怪ivy是ant管理jar依赖关系的。
当第一次bulid时ivy会自动把build中的缺少的依赖进行下载。
网速慢的第一次build要好久的。
。
。
下载一个jar就行把jar放到ant的lib下(E:
\Work\apache-ant\1.9.1\lib)这样再次运行ant就会成功了。
到现在才可以进行Solr的代码调试。
4.4配置并运行Solr代码
不管用什么IDE首选都要设置SolrHome在IDE的JVM参数设置VMarguments写入-Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用绝对路径.
solr使用StartSolrJetty文件作为入口文件进行调试代码,在这里可以设置服务器使用的端口和solr的webapps目录.一般都不用设置,默认的就可以进行调试.SolrHome也能可在代码中设置一样好用.System.setProperty("solr.solr.home","E:
\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");
目前是使用自带的一个example作为solr配置的根目录,如果你有其他的solr配置目录,设置之即可。
点击run即可,debug也是一样可以用了。
没有别的问题就应该能运行了.注意servlet容器使用的端口,如查提示:
FAILEDSocketConnector@0.0.0.0:
8983:
.BindException:
Addressalreadyinuse:
JVM_Bind就说明当前端口占用中.改一下就可以了.如果没有报错启动成功后就可以在浏览器中输入地址:
http:
//localhost:
8983/solr/就可以看到如下界面
到这里Solr就成功配置并运行了.要是想跟代码调试在启动时在这个方法里点断点就可以Initializer的initialize()方法如果想从浏览器中找断点调试就要到SolrDispatchFilter的doFilter方法中点断点了.
注:
IE9在兼容模式下有bug,必须设置为非兼容模式。
5.Solr基础
因为Solr包装并扩展了Lucene,所以它们使用很多相同的术语。
更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。
通过对Solr进行适当的配置,某些情况下可能需要进行编码,Solr可以阅读和使用构建到其他Lucene应用程序中的索引。
在Solr和Lucene中,使用一个或多个Document来构建索引。
Document包括一个或多个Field。
Field包括名称、内容以及告诉Solr如何处理内容的元数据。
例如,Field可以包含字符串、数字、布尔值或者日期,也可以包含你想添加的任何类型,只需用在solr的配置文件中进行相应的配置即可。
Field可以使用大量的选项来描述,这些选项告诉Solr在索引和搜索期间如何处理内容。
现在,查看一下表1中列出的重要属性的子集:
属性名称
描述
Indexed
IndexedField可以进行搜索和排序。
你还可以在indexedField上运行Solr分析过程,此过程可修改内容以改进或更改结果。
Stored
storedField内容保存在索引中。
这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。
例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。
5.1模式配置Schema.xml
schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。
打开这个配置文件,你会发现有详细的注释。
模式组织主要分为三个重要配置
5.1.1.types部分
是一些常见的可重用定义,定义了Solr(和Lucene)如何处理Field。
也就是添加到索引中的xml文件属性中的类型,如int、text、date等.
参数说明:
属性
描述
name
标识而已
class
和其他属性决定了这个fieldType的实际行为。
sortMissingLast
设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则,默认是设置成false。
sortMissingFirst
跟上面倒过来呗。
默认是设置成false
analyzer
字段类型指定的分词器
type
当前分词用用于的操作.index代表生成索引时使用的分词器query代码在查询时使用的分词器
tokenizer
分词器类
filter
分词后应用的过滤器过滤器调用顺序和配置相同.
5.1.2.fileds
是你添加到索引文件中出现的属性名称,而声明类型就需要用到上面的types
∙field:
固定的字段设置
∙dynamicField:
动态的字段设置,用于后期自定义字段,*号通配符.例如:
test_i就是int类型的动态字段.
还有一个特殊的字段copyField,一般用于检索时用的字段这样就只对这一个字段进行索引分词就行了copyField的dest字段如果有多个source一定要设置multiValued=true,否则会报错的
字段属性说明:
属性
描述
name
字段类型名
class
java类名
indexed
缺省true。
说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。
stored
缺省true。
说明这个字段被包含在搜索结果中是合适的。
如果数据没有stored,则indexed应是true。
omitNorms
字段的长度不影响得分和在索引时不做boost时,设置它为true。
一般文本字段不设置为true。
termVectors
如果字段被用来做morelikethis和highlight的特性时应设置为true。
compressed
字段是压缩的。
这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。
multiValued
字段多于一个值的时候,可设置为true。
positionIncrementGap
和multiValued一起使用,设置多个值之间的虚拟空白的数量
注意:
_version_是一个特殊字段,不能删除,是记录当前索引版本号的.
5.1.3.其他配置
uniqueKey:
唯一键,这里配置的是上面出现的fileds,一般是id、url等不重复的。
在更新、删除的时候可以用到。
defaultSearchField:
默认搜索属性,如q=solr就是默认的搜索那个字段
solrQueryParser:
查询转换模式,是并且还是或者(AND/OR必须大写)
5.2.solr配置solrconfig.xml
solrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的E:
\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:
使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置,下面详细说一下索引配置和查询配置.
5.2.1索引indexConfig
Solr性能因素,来了解与各种更改相关的性能权衡。
表1概括了可控制Solr索引处理的各种因素:
属性
描述
useCompoundFile
通过将很多Lucene内部文件整合到一个文件来减少使用中的文件的数量。
这可有助于减少Solr使用的文件句柄数目,代价是降低了性能。
除非是应用程序用完了文件句柄,否则false的默认值应该就已经足够。
ramBufferSizeMB
在添加或删除文档时,为了减少频繁的更些索引,Solr会选缓存在内存中,当内存中的文件大于设置的值,才会更新到索引库。
较大的值可使索引时间变快但会牺牲较多的内存。
如两个值同时设置,满足一个就会进行刷新索引.
maxBufferedDocs
mergeFactor
决定低水平的Lucene段被合并的频率。
较小的值(最小为2)使用的内存较少但导致的索引时间也更慢。
较大的值可使索引时间变快但会牺牲较多的内存。
maxIndexingThreads
indexWriter生成索引时使用的最大线程数
unlockOnStartup
unlockOnStartup告知Solr忽略在多线程环境中用来保护索引的锁定机制。
在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。
将其设置为true可以禁用启动锁定,进而允许进行添加和更新。
lockType
single:
在只读索引或是没有其它进程修改索引时使用.
native:
使用操作系统本地文件锁,不能使用多个Solr在同一个JVM中共享一个索引.
simple:
使用一个文本文件锁定索引.
5.2.2查询配置query
属性
描述
maxBooleanClauses
最大的BooleanQuery数量.当值超出时,抛出TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的.
filterCache
filterCache存储了无序的lucenedocumentid集合,1.存储了filterqueries(“fq”参数)得到的documentid集合结果。
2还可用于facet查询3.3)如果配置了useFilterForSortedQuery,那么如果查询有filter,则使用filterCache。
queryResultCache
缓存搜索结果,一个文档ID列表
documentCache
缓存Lucene的Document对象,不会自热
fieldValueCache
字段缓存使用文档ID进行快速访问。
默认情况下创建fieldValueCache即使这里没有配置。
enableLazyFieldLoading
若应用程序预期只会检索Document上少数几个Field,那么可以将属性设置为true。
延迟加载的一个常见场景大都发生在应用程序返回和显示一系列搜索结果的时候,用户常常会单击其中的一个来查看存储在此索引中的原始文档。
初始的显示常常只需要显示很短的一段信息。
若考虑到检索大型Document的代价,除非必需,否则就应该避免加载整个文档。
queryResultWindowSize
一次查询中存储最多的doc的id数目.
queryResultMaxDocsCached
查询结果doc的最大缓存数量,例如要求每页显示10条,这里设置是20条,也就是说缓存里总会给你多出10条的数据.让你点示下一页时很快拿到数据.
listener
选项定义newSearcher和firstSearcher事件,您可以使用这些事件来指定实例化新搜索程序或第一个搜索程序时应该执行哪些查询。
如果应用程序期望请求某些特定的查询,那么在创建新搜索程序或第一个搜索程序时就应该反注释这些部分并执行适当的查询。
useColdSearcher
是否使用冷搜索,为false时使用自热后的searcher
maxWarmingSearchers
最大自热searcher数量
5.3Solr加入中文分词器
中文分词在solr里面是没有默认开启的,需要我们自己配置一个中文分词器。
目前可用的分词器有smartcn,IK,Jeasy,庖丁。
其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn,ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。
各有优缺点看应用场合自己衡量选择吧。
下面给出两种分词器的安装方法,任选其一即可,推荐第一种,因为smartcn就在solr发行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首选在solrconfig.xml中加一句引用analysis-extras的配置,这样我们自己加入的分词器才会引到的solr中.
5.3.1.smartcn分词器的安装
首选将发行包的contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-4.2.0.jar复制到\solr\contrib\analysis-extras\lib下,在solr本地应用文件夹下,打开/solr/conf/scheme.xml,编辑text字段类型如下,添加以下代码到scheme.xml中的相应位置,就是找到fieldType定义的那一段,在下面多添加这一段就好啦