因为 Solr 包装并扩展了Lucene,所以它们使用很多相同的术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。在 Solr 和 Lucene 中,使用一个或多个 Document 来构建索引。Document包括一个或多个 Field。Field 包括名称、内容以及告诉 Solr 如何处理内容的元数据。
例如,Field 可以包含字符串、数字、布尔值或者日期,也可以包含你想添加的任何类型,只需用在solr的配置文件中进行相应的配置即可。Field 可以使用大量的选项来描述,这些选项告诉 Solr 在索引和搜索期间如何处理内容。
现在,查看一下表中列出的重要属性的子集:
属性名称 |
描述 |
Indexed |
Indexed Field 可以进行搜索和排序。你还可以在 indexed Field 上运行 Solr 分析过程,此过程可修改内容以改进或更改结果。 |
Stored |
stored Field 内容保存在索引中。这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。 |
5.1 配置文件solr.xml
<?xml version="1.0" encoding="UTF-8" ?> <solr persistent="false"> <cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}"> <core name="core0" instanceDir="core0" /> <core name="core1" instanceDir="core1" /> </cores> </solr> |
这里没有配置defaultCoreName,默认为collection1。其中<cores>的adminPath属性指明通过浏览器查看主目录多个核的属性的相对地址。<core>是关于每个核的名字和目录的指示,例如,这里有两个核,core0和core1,它们各自的实例目录分别是solr.xml所在文件夹下的core0和core1目录。而且,就算没有solr.xml文件,也不会报错的,因为都有默认值。
源码片段如下:
public static final String DEFAULT_DEFAULT_CORE_NAME = "collection1"; public static final String DEF_SOLR_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<solr persistent=\"false\">\n" + " <cores adminPath=\"/admin/cores\" defaultCoreName=\"" + DEFAULT_DEFAULT_CORE_NAME + "\"" + " host=\"${host:}\" hostPort=\"${hostPort:}\" hostContext=\"${hostContext:}\" zkClientTimeout=\"${zkClientTimeout:15000}\"" + ">\n" + " <core name=\"" + DEFAULT_DEFAULT_CORE_NAME + "\" shard=\"${shard:}\" collection=\"${collection:collection1}\" instanceDir=\"collection1\" />\n" + " </cores>\n" + "</solr>"; |
5.2 模式配置Schema.xml
schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。打开这个配置文件,会发现有详细的注释。模式组织主要分为三个重要配置
5.2.1. types 部分
是一些常见的可重用定义,定义了 Solr(和 Lucene)如何处理 Field。也就是添加到索引中的xml文件属性中的类型,如int、text、date等.
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/> <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> |
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> |
参数说明:
属性 |
描述 |
name |
标识而已 |
class |
和其他属性决定了这个fieldType的实际行为。 |
sortMissingLast |
设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则, 默认是设置成false。 |
sortMissingFirst |
跟上面倒过来,默认是设置成false |
analyzer |
字段类型指定的分词器 |
type |
当前分词用用于的操作.index代表生成索引时使用的分词器query代码在查询时使用的分词器 |
tokenizer |
分词器类 |
filter |
分词后应用的过滤器 过滤器调用顺序和配置相同. |
5.2.2. fileds
是你添加到索引文件中出现的属性名称,而声明类型就需要用到上面的types
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="path" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true" /> <field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/> <field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/> <field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/> <field name="_version_" type="long" indexed="true" stored="true"/> |
<dynamicField name="*_i" type="int" indexed="true" stored="true"/> <dynamicField name="*_l" type="long" indexed="true" stored="true"/> <dynamicField name="*_s" type="string" indexed="true" stored="true" /> |
· field: 固定的字段设置
· dynamicField: 动态的字段设置,用于后期自定义字段,*号通配符.例如: test_i就是int类型的动态字段.
还有一个特殊的字段copyField,一般用于检索时用的字段这样就只对这一个字段进行索引分词就行了,copyField的dest字段如果有多个source一定要设置multiValued=true,否则会报错的。
另外,使用copyField将多个field都复制到一个总的field上,然后对它进行搜索,可以最小化索引字段并且提高搜索的效率。
<copyField source="content" dest="pinyin"/> <copyField source="content" dest="text"/> <copyField source="pinyin" dest="text"/> |
字段属性说明:
属性 |
描述 |
name |
字段类型名 |
class |
java类名 |
indexed |
缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。 |
stored |
缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。 |
omitNorms |
字段的长度不影响得分和在索引时不做boost时,设置它为true。 一般文本字段不设置为true。 |
termVectors |
如果字段被用来做more like this 和highlight的特性时应设置为true。 |
compressed |
字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。 |
multiValued |
字段多于一个值的时候,可设置为true。 |
positionIncrementGap |
和multiValued一起使用,设置多个值之间的虚拟空白的数量 |
注意:_version_ 是一个特殊字段,不能删除,是记录当前索引版本号的.
5.2.3. 其他配置
uniqueKey: 唯一键,这里配置的是上面出现的fileds,一般是id、url等不重复的。在更新、删除的时候可以用到。
defaultSearchField:默认搜索属性,如q=solr就是默认的搜索那个字段
solrQueryParser:查询转换模式,是并且还是或者(AND/OR必须大写)
5.3. solr配置solrconfig.xml
solrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置。下面详细说明:
5.3.1 索引indexConfig
Solr性能因素,来了解与各种更改相关的性能权衡。 下表概括了可控制 Solr 索引处理的各种因素:
属性 |
描述 |
useCompoundFile |
通过将很多 Lucene 内部文件整合到一个文件来减少使用中的文件的数量。这可有助于减少 Solr 使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄,否则 false 的默认值应该就已经足够。 |
ramBufferSizeMB |
在添加或删除文档时,为了减少频繁的更些索引,Solr会选缓存在内存中,当内存中的文件大于设置的值,才会更新到索引库(也就是<maxBufferedDocs>制定缓存的文档数目达到多少时会自动建立硬盘索引文件)。较大的值可使索引时间变快但会牺牲较多的内存。如两个值同时设置,满足一个就会进行刷新索引 |
maxBufferedDocs |
|
mergeFactor |
决定低水平的 Lucene 段被合并的频率。较小的值(最小为 2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。例如:<meigeFactor>10</mergeFactor>表示,最低级的索引文件数量达到10时会合并为1个索引文件,当这样合成索引文件数目达到10个时,又会合并为更高级的索引文件 |
maxIndexingThreads |
indexWriter生成索引时使用的最大线程数 |
unlockOnStartup |
unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为 true 可以禁用启动锁定,进而允许进行添加和更新。 |
lockType |
single: 在只读索引或是没有其它进程修改索引时使用. native: 使用操作系统本地文件锁,不能使用多个Solr在同一个JVM中共享一个索引. simple :使用一个文本文件锁定索引. |
5.3.2 查询配置query
属性 |
描述 |
maxBooleanClauses |
最大的BooleanQuery数量. 当值超出时,抛出 TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的. |
filterCache |
filterCache存储了无序的lucene document id集合,存储了filter queries(“fq”参数)得到的document id集合结果,还可用于facet,如果配置了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.3.3 <dataDir>
用于替换默认的索引数据目录(./data),如果不是绝对路径,将使用servlet容器当前工作目录下的相对路径。
5.3.4 更新处理器的配置<updateHandler>
该元素用于对更新处理器进行配置,更新处理器是用于更新索引数据的类,主要涉及底层的关于如何更新处理内部的信息。(不要跟高层次的配置参数Request Handlers对处理发自客户端的更新相混淆)
常用配置参数:
<updateHandler class="solr.DirectUpdateHandler2"> <autoCommit> <maxDocs>10000</maxDocs> <maxTime>1000</maxTime> </autoCommit> <listener event="postCommit" class="solr.RunExecutableListener"> <str name="exe">snapshooter</str> <str name="dir">solr/bin</str> <bool name="wait">true</bool> <arr name="args"> <str>arg1</str> <str>arg2</str> </arr> <arr name="env"> <str>MYVAR=val1</str> </arr> </listener> </updateHandler> |
参数说明:
属性 |
描述 |
class |
使用哪个类进行索引更新操作 |
autoCommit |
在何时对索引数据进行提交(就是将内存中的索引写到硬盘)。上面的配置参数指明在内存中缓存的文档数目达到10000或时间达到1000时进行提交。 |
listener |
配置一个“监听器”,这个“监听器”在特定的事件发生时将被触发 |
5.3.5 <requestDispatcher>
这里配置可以被HTTP的requestDispatcher使用的一些参数。
5.3.6 <requestHandler>
可以定义多个请求处理器,这些处理器可以在查询和索引数据更新的时候使用。
5.3.7 <queryResponseWriter>
可以定义多个结果处理器,这些结果处理器会以不同的方式返回结果。
5.4Solr加入中文分词器
中文分词在solr里面是没有默认开启的,需要我们自己配置一个中文分词器。目前可用的分词器有smartcn,IK,Jeasy,庖丁。其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn,ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK ,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。各有优缺点看应用场合自己衡量选择吧。
下面给出两种分词器的安装方法,任选其一即可,推荐第一种,因为smartcn就在solr发行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.7.0.jar,首选在solrconfig.xml中加一句引用analysis-extras的配置,这样我们自己加入的分词器才会引用到solr中.
<lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" /> |
5.4.1. smartcn 分词器的安装
首选将发行包的contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-4.7.0.jar复制到\solr\contrib\analysis-extras\lib下,在solr本地应用文件夹下,打开/solr/conf/scheme.xml,编辑text字段类型如下,添加以下代码到scheme.xml中的相应位置,就是找到fieldType定义的那一段,在下面多添加这一段就好啦
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0"> <analyzer type="index"> <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/> <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/> <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/> </analyzer> </fieldType> |
如果需要检索某个字段,还需要在scheme.xml下面的field中,添加指定的字段,用text_smartcn作为type的名字,来完成中文分词。如 text要实现中文检索的话,就要做如下的配置:
<field name ="text" type ="text_smartcn" indexed ="true" stored ="false" multiValued ="true"/> |
5.4.2. IK 分词器的安装
首选要去下载IKAnalyzer的发行包.下载地址: http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.
下载后解压出来文件中的三个复制到\solr\contrib\analysis-extras\lib目录中.
IKAnalyzer2012FF_u1.jar 分词器jar包
IKAnalyzer.cfg.xml 分词器配置文件
Stopword.dic 分词器停词字典,可自定义添加内容
复制后就可以像smartcn一样的进行配置scheme.xml了.
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> |
<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/> |
现在来验证下是否添加成功,首先使用StartSolrJetty来启动solr服务,启动过程中如果配置出错,一般有两个原因:一是配置的分词器jar找不到,也就是你没有复制jar包到\solr\contrib\analysis-extras\lib目前下;二是分词器版本不对导致的分词器接口API不一样出的错,要是这个错的话就在检查分词器的相关文档,看一下支持的版本是否一样.
如果在启动过程中没有报错的话说明配置成功了.我们可以进入到http://localhost:8080/solr地址进行测试一下刚加入的中文分词器.在首页的Core Selector中选择你配置的Croe后点击下面的Analysis,在AnalyseFieldname / FieldType里选择你刚才设置的字段名称或是分词器类型,在Field Value(index)中输入:中国人,点击右面的分词就行了.
更多精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码: