solr配置文件解析

Solr安装

一、Solr的安装

1 在Windows上单机安装Solr

环境:Windows Server 2008、Java SDK、Tomcat 8、Solr 5.1.0

步骤:

(1)安装Java;

(2)安装Tomcat;

(3)解压Solr 5.1.0.zip到Solr-5.1.0目录;

(4)部署solr.war

在..\solr-5.1.0\server\webapps下的solr.war,通过Tomcat管理界面部署solr.war,或者将solr.war拷贝到Tomcat_HOME\webapps\下,重新启动Tomcat完成基本部署;

(5)配置Solr日志

关闭Tomcat,将. .\ solr-5.1.0\server\lib\ext\下的slf4j-api-1.7.7等文件拷贝到Tomcat_HOME\lib目录下,这些文件主要用于solr运行中的log日志;再将..\solr-5.1.0\solr-5.1.0\server\resources\下的log4j.properties拷贝到Tomcat_HOME\lib下,修改log4j.properties文件中的内容:log4j.appender.file.File=logs/solr.log,表明solr的日志存储在Tomcat_HOME\logs目录下;

(6)建立solr home

建立home目录如C:\solr\home\,将..\solr-5.1.0\solr-5.1.0\server\solr下的solr.xml拷贝到C:\solr\home\下,修改Tomcat_HOME\webapps\solr\WEB-INF下的web.xml文件,取消配置文件中如下段的注释,并将<env-entry-value>的值设置为C:\solr\home,结果如下:

<env-entry>

<env-entry-name>solr/home</env-entry-name>

 <env-entry-value>C:\solr\home</env-entry-value>

 <env-entry-type>java.lang.String</env-entry-type>

</env-entry>

修改solr home下的solr.xml文件,将<solrcloud>下的<int name="hostPort">${jetty.port:9001}</int>的端口号修改为Tomcat的端口号相同。

重启Tomcat完成基本安装过程。

通过http://ip-address:port/solr查看安装结果,如果安装正确,则可看到如下界面。

(7)配置核心core

以新建核心core1为例。在solr home下新建文件夹core1,将..\solr-5.1.0\server\solr\configsets\basic_configs文件夹下的conf目录整体拷贝到solr home\core1目录下。启动Tomcat服务器,通过浏览器访问solr。在浏览器左侧可以看到Core Admin,可以添加一个core1核心,name和instanceDir均设置成core1即可。

2 在Windows上安装SolrCloud

(1)在多台服务器或虚拟机上安装Solr

安装与核心配置方法如同单机安装Solr,初始时Tomcat不启动。

(2)安装配置zookeeper

解压zookeeper,在..\zookeeper文件夹下新建data文件夹,在..\zookeeper\conf下的zoo_sample.cfg文件改名为zoo.cfg,并修改配置如下:

tickTime=2000

initLimit=10

syncLimit=5

dataDir=c:\\zookeeper\\data

clientPort=2181

maxClientCnxns=60

sc_maintenance

autopurge.snapRetainCount=3

autopurge.purgeInterval=1

server.1=zookeeperserver 1 ip address:2888:3888

server.2=zookeeperserver 2 ip address:2888:3888

在data文件夹下新建文件myid,并在文件中输入id,如对server.1来说,就输入1。

在bin目录下,通过zkServer.cmd启动zookeeper。

(3)配置leader solr

配置Java Options

-DzkHost=zookeeperserver 1 ip address:2181, zookeeper server 2 ip address:2181

-Dbootstrap_confdir=..\solr\home\core1\conf

-Dcollection.configName=myconf

-DnumShards=2

(4)配置slave solr

配置Java Options

-DzkHost=zookeeperserver 1 ip address:2181, zookeeper server 2 ip address:2181

-DnumShards=2

(5)启动leader和slave

在浏览器中通过leader或slave验证solrcloud的安装是否成功,显示如下则表明成功。

二、solr的配置文件

(一)solr.xml

The solr.xml file isthe first config file that Solr tries to find, and it looks in solr.solr.home.This gives Solr global config information and tells it where to find its cores.The rest of the config comes from each defined core. If solr.xml does not exist,Solr will attempt to start in single-core mode. Support for single-core mode islikely to be removed in version 5.0.

In each core, Solrwill look for a conf/solrconfig.xml file. The solrconfig may point Solr atother config files, like conf/dih-config.xml for the dataimport handler. Unlessthe config filename is changed in solrconfig.xml, conf/schema.xml will be usedto load the schema.

 

(二)solrconfig.xml 应用解析调优

solrconfig.xml配置文件主要定义了solr的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。

下面将对solrconfig进行详细描述:

1<luceneMatchVersion>4.8</luceneMatchVersion> 表示solr底层使用的是lucene4.8

2<lib dir="../../../contrib/extraction/lib"regex=".*\.jar" /> 表示solr引用包的位置,当dir对应的目录不存在时候,会忽略此属性

3<dataDir>${solr.data.dir:}</dataDir> 定义了索引数据和日志文件的存放位置

4directoryFactory

索引存储方案,共有以下存储方案:

1)、solr.StandardDirectoryFactory 这是一个基于文件系统存储目录的工厂,它会试图选择最好的实现基于你当前的操作系统和Java虚拟机版本。

2)、solr.SimpleFSDirectoryFactory 适用于小型应用程序,不支持大数据和多线程。

3)、solr.NIOFSDirectoryFactory 适用于多线程环境,但是不适用在windows平台(很慢),是因为JVM还存在bug。

4)、solr.MMapDirectoryFactory 这个是solr3.1到4.0版本在linux64位系统下默认的实现。它是通过使用虚拟内存和内核特性调用

mmap去访问存储在磁盘中的索引文件。它允许lucene或solr直接访问I/O缓存。如果不需要近实时搜索功能,使用此工厂是个不错的方案。

5)、solr.NRTCachingDirectoryFactory 此工厂设计目的是存储部分索引在内存中,从而加快了近实时搜索的速度。

6)、solr.RAMDirectoryFactory 这是一个内存存储方案,不能持久化存储,在系统重启或服务器crash时数据会丢失。且不支持索引复制

  <directoryFactoryname="DirectoryFactory"

                   class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}">

    <strname="solr.hdfs.home">${solr.hdfs.home:}</str>

    <strname="solr.hdfs.confdir">${solr.hdfs.confdir:}</str>

    <strname="solr.hdfs.blockcache.enabled">${solr.hdfs.blockcache.enabled:true}</str>

    <strname="solr.hdfs.blockcache.global">${solr.hdfs.blockcache.global:true}</str>

  </directoryFactory>

5<codecFactory class="solr.SchemaCodecFactory"/>

<schemaFactoryclass="ClassicIndexSchemaFactory"/>

编解码允许使用自定义的编解码器。例如:如果想启动per-field DocValues格式, 可以在solrconfig.xml里面设置SchemaCodecFactory:

docValuesFormat="Lucene42":这是默认设置,所有数据会被加载到堆内存中。

docValuesFormat="Disk":这是另外一个实现,将部分数据存储在磁盘上。

docValuesFormat="SimpleText":文本格式,非常慢,用于学习。

6<indexConfig>

用于设置索引的低级别的属性

1) <filterclass="solr.LimitTokenCountFilterFactory"maxTokenCount="10000"/> //限制token最大长度

2)<writeLockTimeout>1000</writeLockTimeout> //IndexWriter等待解锁的最长时间(毫秒)

3)<maxIndexingThreads>12</maxIndexingThreads> //生成索引时使用的最大线程数.

4)<useCompoundFile>false</useCompoundFile>

 //solr默认为false。如果为true,索引文件减少,检索性能降低,追求平衡。通过将很多 Lucene 内部文件整合到单一一个文件来减少使用中的文件的数量。这可有助于减少 Solr 使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄

5)<ramBufferSizeMB>100</ramBufferSizeMB> //缓存

6) <maxBufferedDocs>1000</maxBufferedDocs>//缓存。两个同时定义时命中较低的那个。在合并内存中文档和创建新段之前,定义所需索引的最小文档数。段是用来存储索引信息的 Lucene 文件。较大的值可使索引时间变快但会牺牲较多的内存。

7)

`<mergePolicyclass="org.apache.lucene.index.TieredMergePolicy">

        <intname="maxMergeAtOnce">20</int>

        <int name="segmentsPerTier">20</int>

        </mergePolicy>`

 

 

//合并策略。

8)<mergeFactor>10</mergeFactor> //合并因子,每次合并多少个segments。决定低水平的 Lucene 段被合并的频率。较小的值(最小为 2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。

9) <mergeSchedulerclass="org.apache.lucene.index.ConcurrentMergeScheduler"/> //合并调度器。

10)<lockType>${solr.lock.type:native}</lockType> //锁。

11)<unlockOnStartup>false</unlockOnStartup> //unlockOnStartup告知Solr 忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为 true 可以禁用启动锁定,进而允许进行添加和更新。

12) <termIndexInterval>128</termIndexInterval>//Lucene loads terms into memory 间隔

13)<reopenReaders>true</reopenReaders> //重新打开,替代先关闭-再打开。

14) <deletionPolicyclass="solr.SolrDeletionPolicy"> //提交删除策略,必须实现org.apache.lucene.index.IndexDeletionPolicy

 15)<str name="maxCommitsToKeep">1</str> //最多持有提交点的数量

16) <strname="maxOptimizedCommitsToKeep">0</str> //最多持有优化提交点的数量

17) <strname="maxCommitAge">2MINUTES</str> OR <strname="maxCommitAge">1DAY</str><br> //一旦达到指定的时间删除所有的提交点  

18) <infoStreamfile="INFOSTREAM.txt">false</infoStream>//相当于把创建索引时的日志输出。

<lockType>${solr.lock.type:native}</lockType>

设置索引库的锁方式,主要有三种:

⑴.single:适用于只读的索引库,即索引库是定死的,不会再更改

⑵.native:使用本地操作系统的文件锁方式,不能用于多个solr服务共用同一个索引库。Solr3.6 及后期版本使用的默认锁机制。

⑶.simple:使用简单的文件锁机制

19)<maxMergeDocs> 2147483647 </maxMergeDocs> //控制可由 Solr 合并的 Document 的最大数。较小的值 (< 10,000) 最适合于具有大量更新的应用程序。

20)<maxFieldLength> 10000 </maxFieldLength>

 //对于给定的Document,控制可添加到 Field 的最大条目数,进而截断该文档。如果文档可能会很大,就需要增加这个数值。然而,若将这个值设置得过高会导致内存不足错误。

 (默认设置 <filterclass="solr.LimitTokenCountFilterFactory"maxTokenCount="10000"/>)

7updateHandler节点

<updateLog>

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

</updateLog>

设置索引库更新日志,默认路径为solr home下面的data/tlog。随着索引库的频繁更新,tlog文件会越来越大,所以建议提交索引时采用硬提交方式,即批量提交。

<autoCommit>

   <maxDocs>10000</maxDocs>

   <maxTime>${solr.autoCommit.maxTime:5000}</maxTime>

  <openSearcher>true</openSearcher>

 </autoCommit>

自动硬提交方式:maxTime:设置多长时间提交一次maxDocs:设置达到多少文档提交一次openSearcher:文档提交后是否开启新的searcher,

如果false,文档只是提交到index索引库,搜索结果中搜不到此次提交的文档;如果true,既提交到index索引库,也能在搜索结果中搜到此次提交的内容。

<autoSoftCommit>`

   <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>

</autoSoftCommit>`//软提交;

 1、把内存文件fsync到磁盘,但不创建index descriptor。也就是说原索引和现在的索引还互不感知,所以如果jvm崩溃,那这部分索引就没了。

 2、可以重新打开searcher,使得新的索引可以被查找到。

<listenerevent="postCommit" class="solr.RunExecutableListener">` 

    `<strname="exe">solr/bin/snapshooter</str>`   //exe--可执行的文件类型

    `<strname="dir">.</str>`//dir--可以用该目录做为当前的工作目录。默认为 "."

    `<boolname="wait">true</bool> //wait--调用线程要等到可执行的返回值

    `<arr name="args"><str>arg1</str> <str>arg2</str> </arr>`   //args--传递给程序的参数 默认nothing 

    `<arr name="env"><str>MYVAR=val1</str> </arr> //env--环境变量的设置 默认nothing

</listener>

//一个postCommit的事件被触发当每一个提交之后,   

 

 PS:自己的一些见解,solr提交索引的方式共有三种,通过solr api去提交的方式性能很差,不建议采用;个人建议还是采用autocommit的自动提交,虽然比较消耗资源,但是能最大限度保存意外造成的索引丢失的情况;

8Query查询节点

<maxBooleanClauses>1024</maxBooleanClauses>

设置boolean 查询中,最大条件数。在范围搜索或者前缀搜索时,会产生大量的 boolean 条件, 如果条件数达到这个数值时,将抛出异常,限制这个条件数,可以防止条件过多查询等待时间过长。

`<!--过滤器缓存 -->

 <filterCacheclass="solr.FastLRUCache"

             size="32768"

             initialSize="32768"

            autowarmCount="512"/>`

 `<!-- 查询结果缓存-->

 <queryResultCacheclass="solr.FastLRUCache"

             size="8192"

             initialSize="8192"

            autowarmCount="512"/>`

 `<!-- 查询文档缓存-->

 <documentCacheclass="solr.FastLRUCache"

             size="4096"

             initialSize="4096"

             autowarmCount="0"/>`

 `<!-- 自定义缓存-->

 <cache name="perSegFilter"

            class="solr.search.LRUCache"

             size="4096"

             initialSize="4096"

             autowarmCount="4096"

            regenerator="solr.NoOpRegenerator" />`

 `<!-- 字段值缓存-->

 <fieldValueCacheclass="solr.FastLRUCache"

             size="512"

             autowarmCount="128"

             showItems="32" />`

1)size:cache中可保存的最大的项数,默认是1024

2)initialSize:cache初始化时的大小,默认是1024。

3)autowarmCount:当切换SolrIndexSearcher时,可以对新生成的SolrIndexSearcher做autowarm(预热)处理。autowarmCount表示从旧的SolrIndexSearcher中取多少项来在新的SolrIndexSearcher中被重新生成,如何重新生成由CacheRegenerator实现。在当前的1.4版本的Solr中,这个autowarmCount只能取预热的项数,将来的4.0版本可以指定为已有cache项数的百分比,以便能更好的平衡autowarm的开销及效果。如果不指定该参数,则表示不做autowarm处理。

实现上,LRUCache直接使用LinkedHashMap来缓存数据,由initialSize来限定cache的大小,淘汰策略也是使用LinkedHashMap的内置的LRU方式,读写操作都是对map的全局锁,所以并发性效果方面稍差。

<enableLazyFieldLoading>true</enableLazyFieldLoading>`   //某些字段延时加载,以提高性能,例如内容较多的压缩文件

<queryResultWindowSize>50</queryResultWindowSize>`       //Result Window Size 优化queryResultCache结果cache

<queryResultMaxDocsCached>800</queryResultMaxDocsCached>`  //查询结果文档的最大缓存数

<!--与请求相关的监听器 --> 

<!--QuerySenderListener使用NamedList的数组和每个序列NamedList的执行一个本地查询请求。-->

<listenerevent="newSearcher" class="solr.QuerySenderListener">

<arrname="queries">      </arr>

</listener>

<listenerevent="firstSearcher" class="solr.QuerySenderListener">

    <arr name="queries">

    <lst>

      <str name="q">staticfirstSearcher warming in solrconfig.xml</str>

    </lst>

    </arr>

 </listener>

<useColdSearcher>true</useColdSearcher>`   //使用云搜索

<maxWarmingSearchers>8</maxWarmingSearchers>`

 //该参数用于设置最大的searcher 数量,这些 searcher 实现预热好的,随时可以调用。如果超过这个数量,将会报错。在一个只读的索引库中,2个预热的 searcher 是相对合理的,如果是读写的索引库中,根据内存和cpu的大小可以给一个相对大一点的值。

 

9Request Dispatcher(请求转发器)

<!--Request Dispatcher 主要是介绍当有请求访问SolrCore时SolrDispatchFilter如何处理。 handleSelect是一个以前版本中遗留下来的属性,会影响请求的对应行为(比如/select?qt=XXX)。当handleSelect="true"时导致SolrDispatchFilter将请求转发给qt指定的处理器(前提是/select已经注册)。 当handleSelect="false"时会直接访问/select,若/select未注册则为404。 -->

<requestDispatcherhandleSelect="false" >

`<!--Request Parsing:请求解析 

 这些设置说明Solr Requests如何被解析,以及对ContentStreams有什么限制。 

 enableRemoteStreaming - 是否允许使用stream.file和stream.url参数来指定远程streams。 

 multipartUploadLimitInKB - 指定多文件上传时Solr允许的最大的size,设置了通过多部分(multi-part)的HTTP POST请求提交的文档大小的上限,单位是Kb。这个值指定为1024的倍数来确定Bytes的大小

 formdataUploadLimitInKB - 表单通过POST请求发送的最大size,设置了一个用Kb表示的限制,用以限制HTTP POST请求中提交的表单数据的大小,这个大小可以用来传递请求的参数但并不适合(写入)URL中addHttpRequestToContext - 用来声明原始的HttpServletRequest对象应该被包括在使用httpRequest的SolrQueryRequest的上下文集合(context map)中。这个HttpServletRequest不会用于任何Solr的组成部分,但在开发自定义的插件是会很有用 -->`

 `<requestParsersenableRemoteStreaming="true"

                multipartUploadLimitInKB="2048000"

                formdataUploadLimitInKB="20480"

                addHttpRequestToContext="false"/>`

<httpCaching>`元素控制了HTTP缓存控制头(HTTP cache control headers)。不要将这些设置和Solr内部的缓存配置混淆。这个元素控制了W3C HTTP规格定义的HTTP响应的缓存过程。这个元素允许三个属性和一个下级元素。

<httpCaching>`元素的属性决定了是否允许对一个GET请求进行304响应,如果可以,它应该是什么响应类别(sort)。当一个HTTP用户程序生成一个GET请求,如果资源从上一次被取得后还没有被修改,那么它可以可选择地指定一个可接受的304响应。never304

如果将这个值设置为true,那么即使请求的资源还没有被修改,一个GET请求也永远不会得到一个304响应。如果这个属性被设置为true,那么接下来的两个属性会被忽略。将这个属性设置为true对于开发来说是方便的,因为当通过支持缓存头的web浏览器或者其他用户修补Solr的响应时,304响应可能会使人混淆。

lastModFrom这个属性可以设置为openTime(默认值)或者dirLastMod。openTime指示了最后更改时间,相对于客户发送的If-Modified-Since头,它应该在搜索器开始的时候计算。如果当索引在硬盘上更新时你需要精确同步,那么使用dirLastMod。

etagSeed这个属性的值被作为ETag头的值。改变这个值可以有助于强制用户重新取得内容,即使索引没有被改变。例如,当你修改了配置的时候。

<httpCachingnever304="false"

 lastModFrom="openTime"

 etagSeed="Solr">

 <cacheControl>max-age=30,public</cacheControl>

 </httpCaching>`

10requestHandler(请求处理器)

提供了类似webservice的功能,可以通过http请求solr搜索

Configuration

<requestHandlername="/select" class="solr.SearchHandler">

<lstname="defaults">

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

<intname="rows">10</int> //显示数量-

 <strname="df">text</str> //默认搜索字段

</lst>

`<requestHandlername="/query" class="solr.SearchHandler">

   <lst name="defaults">

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

     <strname="wt">json</str>    //显示格式

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

     <strname="df">text</str>

   </lst>

  </requestHandler>`

 

   这些参数定义了需要返回多少结果(定义值为10),通过参数df定义了搜索的域默认为“text”域。echoParams参数定义了查询中的在调试信息返回的客户端请求中的参数。

   另外还要注意在列表中这些默认值定义方法的变化:当参数是String,integer或其他类型时,定义类型是不同的。

   所有这些在搜索部分描述的参数可以在任何SearchHandlers中定义为默认值(这些参数的细节信息请参考搜索部分)

   除了这些默认值,还有一些选择可用于SearchHandler,包括了下面的这些内容:

   appends:这个设置允许在用户查询中添加参数的定义。这些参数可能是过滤查询,或者其他可以被加入每一个查询的查询规则。在Solr中没有机制允许客户端覆盖这些添加,所以你应当确定你总是需要在查询中加入这些参数。

    `<lst name="appends">

     <strname="fq">inStock:true</str>

    </lst>`

   在这个例子中,过滤查询“inStock:true”会添加到每一个查询上。

   Invariants:这个设置允许定义不会被客户端覆盖的参数。在invariants部分定义的值总是会被使用,而不考虑用户或客户端默认的或添加的值。

     `<lst name="invariants">

     <strname="facet.field">cat</str>

     <strname="facet.field">manu_exact</str>

     <strname="facet.query">price:[* TO 500]</str>

     <strname="facet.query">price:[500 TO *]</str>

     </lst>`

   在这个例子中,facet域被定义,这个定义会限制Solr返回的facets。如果客户端请求facets,那么他们只会看到和这个配置的相同的facets。

   在requesthandler最后部分,是组件(component)的定义,它定义了可以被用于一个request

   Handler的搜索组件的列表。它们仅在request handler中注册。对搜索组件的更进一步的讨论在搜索组件部分。搜索组件元素只能被用于SearchHandler。

   Handler Resolution

   客户端可以通过带有“gt”这个参数的“/select/ url”请求,也可以通过在solrconfig.xml配置的方式来决定要访问的SolrRequestHandler。

   Solr是通过下面的步骤去选择一个handler并处理请求的.....

   寻找name属性跟请求中的qt参数匹配的handler

   寻找在配置文件中“default=true”的handler

   寻找在配置文件中name属性为“standad”的handler

   使用StandardRequestHandler的默认实例

   如果你的配置文件solrconfig.xml包含有name属性为"/select","/update", 或"/admin",那么你的程序将不会沿用标准的请求处理过程,而将会是你自己自定义的逻辑。

   扩展自己的Handler

   实现一个SolrRequestHandler最简单的方法是去扩展 RequestHandlerBase 类。

(三)schema.xml配置文件

schema.xml类似于数据表配置文件,定义了加入索引的数据的数据类型,主要包括types、

先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。

name:就是这个FieldType的名称。

class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。

<schemaname="example" version="1.2"> 

  <types> 

    <fieldType name="string"class="solr.StrField" sortMissingLast="true"omitNorms="true"/>

    <fieldType name="boolean"class="solr.BoolField" sortMissingLast="true"omitNorms="true"/>

    <fieldtype name="binary"class="solr.BinaryField"/> 

    <fieldType name="int"class="solr.TrieIntField" precisionStep="0"omitNorms="true" positionIncrementGap="0"/> 

    <fieldType name="float" class="solr.TrieFloatField"precisionStep="0" omitNorms="true" positionIncrementGap="0"/> 

    <fieldType name="long"class="solr.TrieLongField" precisionStep="0"omitNorms="true" positionIncrementGap="0"/> 

    <fieldType name="double"class="solr.TrieDoubleField" precisionStep="0"omitNorms="true" positionIncrementGap="0"/> 

  ... 

  </types> 

  ... 

</schema> 

必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤,如下:

<fieldTypename="text_ws" class="solr.TextField"positionIncrementGap="100">

  <analyzer>

    <tokenizerclass="solr.WhitespaceTokenizerFactory"/>

  </analyzer>

</fieldType>

<fieldTypename="text" class="solr.TextField"positionIncrementGap="100">

  <analyzer type="index">

<!--这个分词包是空格分词,在向索引库添加text类型的索引时,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果,才会加入到索引库中以备查询。注意:Solr的analysis包并没有带支持中文的包,需要自己添加中文分词器,google下。-->

    <tokenizerclass="solr.WhitespaceTokenizerFactory"/>

    <!-- in this example, we will only usesynonyms at query time -->

    <filterclass="solr.SynonymFilterFactory"synonyms="index_synonyms.txt" ignoreCase="true"expand="false"/>

    <!-- Case insensitive stop word removal.add enablePositionIncrements=true in both the index and query analyzers toleave a 'gap' for more accurate phrase queries. -->

    <filterclass="solr.StopFilterFactory" ignoreCase="true"  words="stopwords.txt"

                enablePositionIncrements="true"/>

    <filterclass="solr.WordDelimiterFilterFactory"generateWordParts="1"

              generateNumberParts="1"catenateWords="1" catenateNumbers="1"

              catenateAll="0"splitOnCaseChange="1"/>

    <filterclass="solr.LowerCaseFilterFactory"/>

    <filterclass="solr.SnowballPorterFilterFactory" language="English"                                                       protected="protwords.txt"/>

</analyzer>

<analyzertype="query">

    <tokenizerclass="solr.WhitespaceTokenizerFactory"/>

      <filterclass="solr.SynonymFilterFactory" synonyms="synonyms.txt"ignoreCase="true" expand="true"/>

    <filterclass="solr.StopFilterFactory"  ignoreCase="true" words="stopwords.txt"

                enablePositionIncrements="true"/>

    <filterclass="solr.WordDelimiterFilterFactory"generateWordParts="1"

               generateNumberParts="1" catenateWords="0"catenateNumbers="0"

catenateAll="0"splitOnCaseChange="1"/>

   <filter class="solr.LowerCaseFilterFactory"/>

   <filterclass="solr.SnowballPorterFilterFactory" language="English"protected="protwords.txt"/>

 </analyzer>

</fieldType>

2、再来看下fields节点内定义具体的字段(类似数据库的字段),含有以下属性:

Each <field> hasa name that you will use to reference it when adding documents or executingsearches, and an associated type which identifies the name of the fieldtype youwish to use for this field. There are various field options that apply to afield. These can be set in the field type declarations, and can also beoverridden at an individual field's declaration. Field names should consist ofalphanumeric or underscore characters only and not start with a digit. This isnot currently strictly enforced, but other field names will not have firstclass support from all components and back compatibility is not guaranteed.Names with both leading and trailing underscores (e.g. _version_) are reserved.

name:字段名

type:之前定义过的各种FieldType

indexed:是否被索引

stored:是否被存储(如果不需要存储相应字段值,尽量设为false)

multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)

<fields>

    <field name="id"type="integer" indexed="true" stored="true"required="true" />

    <field name="name"type="text" indexed="true" stored="true" />

    <field name="summary"type="text" indexed="true" stored="true" />

    <field name="author"type="string" indexed="true" stored="true" />

    <field name="date"type="date" indexed="false" stored="true" />

    <field name="content"type="text" indexed="true" stored="false" />

    <field name="keywords"type="keyword_text" indexed="true" stored="false"multiValued="true" />

    <!--拷贝字段-->

    <field name="all"type="text" indexed="true" stored="false"multiValued="true"/>

</fields>

3、建议建立一个拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索:

以下是拷贝设置:

<copyFieldsource="name" dest="all"/>

<copyFieldsource="summary" dest="all"/>

4、动态字段,没有具体名称的字段,用dynamicField字段

如:name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i, school_i

   <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>

   <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>

   <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>

   <dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>

   <dynamicField name="*_b"  type="boolean"indexed="true"  stored="true"/>

   <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>

   <dynamicField name="*_d"  type="double"indexed="true" stored="true"/>

   <dynamicField name="*_dt"type="date"   indexed="true" stored="true"/>

schema.xml文档注释中的信息:

1、为了改进性能,可以采取以下几种措施:

将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false

将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false

删除所有不必要的copyField声明

为了索引字段的最小化和搜索的效率,将所有的 text fields的index都设置成field,然后使用copyField将他们都复制到一个总的text field上,然后对他进行搜索。

为了最大化搜索效率,使用java编写的客户端与solr交互(使用流通信)

在服务器端运行JVM(省去网络通信),使用尽可能高的Log输出等级,减少日志量。

2、<schemaname="example" version="1.2">

name:标识这个schema的名字

version:现在版本是1.2

3、filedType

<fieldTypename="string" class="solr.StrField"sortMissingLast="true" omitNorms="true" />

name:标识而已。

class和其他属性决定了这个fieldType的实际行为。(class以solr开始的,都是在org.appache.solr.analysis包下)

可选的属性:

sortMissingLast和sortMissingFirst两个属性是用在可以内在使用String排序的类型上(包括:string, boolean, sint, slong, sfloat,sdouble, pdate)。

sortMissingLast="true"时,那些在该<field>上没有值的documents将被排在那些在该<field>上有值的documents之后。

sortMissingFirst="true",跟上面倒过来。

2个值默认是设置成false,如果两者都设为false,则使用Lucene的排序。

StrField类型不被分析,而是被逐字地索引/存储。

StrField和TextField都有一个可选的属性“compressThreshold”,保证压缩到不小于一个大小(单位:char)

<fieldTypename="text" class="solr.TextField" positionIncrementGap="100">

solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)

positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。

positionIncrementGap=100只对 multiValue = true 的fieldType有意义。

Suppose a document hasa multi-valued "author" field.  Like this:

author: John Doe

author: Bob Smith

With a positionincrement gap of 0, a phrase query of "doe bob" would  

be a match.  But often it is undesirable for that kind ofmatch across  

different fieldvalues.  A position increment gapcontrols the virtual  

space between the lasttoken of one field instance and the first token  

of the nextinstance.  With a gap of 100, thisprevents phrase queries  

(even with a modestslop factor) from matching across instances.

 

<tokenizerclass="solr.WhitespaceTokenizerFactory" />

空格分词,精确匹配。

<filterclass="solr.WordDelimiterFilterFactory"generateWordParts="1" generateNumberParts="1" catenateWords="1"catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>

在分词和匹配时,考虑 "-"连字符,字母数字的界限,非字母数字字符,这样 "wifi"或"wi fi"都能匹配"Wi-Fi"。

<filterclass="solr.SynonymFilterFactory" synonyms="synonyms.txt"ignoreCase="true" expand="true" />

同义词

<filterclass="solr.StopFilterFactory" ignoreCase="true"words="stopwords.txt" enablePositionIncrements="true" />

在禁用字(stopword)删除后,在短语间增加间隔

stopword:即在建立索引过程中(建立索引和搜索)被忽略的词,比如is this等常用词。在conf/stopwords.txt维护。

4、fields

<fieldname="id" type="string" indexed="true"stored="true" required="true" />

name:标识而已。

type:先前定义的类型。

indexed:是否被用来建立索引(关系到搜索和排序)

stored:是否储存

compressed:[false],是否使用gzip压缩(只有TextField和StrField可以压缩)

mutiValued:是否包含多个值

omitNorms:是否忽略掉Norm,可以节省内存空间,只有全文本field和need an index-time boost的field需要norm。(具体没看懂,注释里有矛盾)

termVectors:[false],当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。

termPositions:存储 term vector中的地址信息,会消耗存储开销。

termOffsets:存储 term vector 的偏移量,会消耗存储开销。

default:如果没有属性需要修改,就可以用这个标识下。

<fieldname="text" type="text" indexed="true"stored="false" multiValued="true" />

包罗万象(有点夸张)的field,包含所有可搜索的text fields,通过copyField实现。

<copyFieldsource="cat" dest="text" />

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

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

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

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

在添加索引时,将所有被拷贝field(如cat)中的数据拷贝到text field中

作用:

将多个field的数据放在一起同时搜索,提供速度

将一个field的数据拷贝到另一个,可以用2种不同的方式来建立索引。

<dynamicFieldname="*_i" type="int" indexed="true"stored="true" />

如果一个field的名字没有匹配到,那么就会用动态field试图匹配定义的各种模式。

"*"只能出现在模式的最前和最后

较长的模式会被先去做匹配

如果2个模式同时匹配上,最先定义的优先

<dynamicFieldname="*" type="ignored" multiValued="true" />

如果通过上面的匹配都没找到,可以定义这个,然后定义个type,当String处理。(一般不会发生)

但若不定义,找不到匹配会报错。

5、其他一些标签

<uniqueKey>id</uniqueKey>

文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。

<defaultSearchField>text</defaultSearchField>

如果搜索参数中没有指定具体的field,那么这是默认的域。

<solrQueryParserdefaultOperator="OR" />

配置搜索参数短语间的逻辑,可以是"AND|OR"。

A Solr schema.xml fileallows two methods for specifying the way a text field is analyzed. (Normallyonly field types of solr.TextField will have Analyzers explicitly specified inthe schema):

1.Specifying the classname of an Analyzer — This can be anything extendingorg.apache.lucene.analysis.Analyzer which has either a default constructor, ora single argument constructor taking in a lucene "Version" object

 Example:

<fieldtypename="nametext" class="solr.TextField">

  <analyzerclass="org.apache.lucene.analysis.WhitespaceAnalyzer"/>

</fieldtype>

2.Specifying aTokenizerFactory followed by a list of optional TokenFilterFactories that areapplied in the listed order. Factories that can create the tokenizers or tokenfilters are used to prepare configuration for the tokenizer or filter and avoidthe overhead of creation via reflection.

 Example:

<fieldtype name="text"class="solr.TextField">

  <analyzer>

    <charFilterclass="solr.HTMLStripCharFilterFactory"/>

    <charFilterclass="solr.MappingCharFilterFactory"

mapping="mapping-ISOLatin1Accent.txt"/>

    <tokenizerclass="solr.StandardTokenizerFactory"/>

    <filterclass="solr.LowerCaseFilterFactory"/>

    <filterclass="solr.StopFilterFactory"/>

    <filterclass="solr.PorterStemFilterFactory"/>

  </analyzer>

</fieldtype>

Any Analyzer,CharFilterFactory, TokenizerFactory, or TokenFilterFactory may be specifiedusing its full class name with package -- just make sure they are in Solr'sclasspath when you start your appserver. Classes in theorg.apache.solr.analysis.* package can be referenced using the short aliassolr.*.

If you want to usecustom CharFilters, Tokenizers or TokenFilters, you'll need to write a verysimple factory that subclasses BaseTokenizerFactory or BaseTokenFilterFactory,something like this...

public classMyCustomFilterFactory extends BaseTokenFilterFactory {

  public TokenStream create(TokenStream input){

    return new MyCustomFilter(input);

  }

}

Analyzer由不同组件构成:CharFilteràTokenizeràTokenFilter

 

HTMLStripCharFilter

该过滤器能够将HTML标记从输入流中脱去并将结果传递给其它CharFilter或者Tokenizer。和其它CharFilters一样,在schema.xml文件中,使用<charFilter>标记进行指定,且必须出现在<tokenizer>前面。如下所示:

<analyzer>

  <charFilterclass="solr.HTMLStripCharFilterFactory"/>

  <tokenizerclass="solr.StandardTokenizerFactory"/>

</analyzer>

HTML脱除特性:

输入文档除标准HTML文档外,还可以是近似HTML文档,如XML等;

移除HTML/XML标记,并保持内容不变,标记内的属性也会移除,但属性引用是可选的;

移除XML处理指令:<?foo bar?>;

移除XML注释;

移除XML中的以<! 开始和以 >结尾的元素;

移除<script>和<style>元素;

移除XML文档中元素中间的注释;

替换数组字符实体引用,例如&#65; or &#x7f;

“;“结束符是可选的,如果实体引用是以空白符结尾;

替换所有命名字符引用;&nbsp;被替换成空格

HTML脱除举例:

my <a href="www.foo.bar">link</a> 

my link 

<br>hello<!--comment--> 

hello 

hello<script><!-- f('<!--internal--></script>'); --></script> 

hello 

if a<b then print a; 

if a<b then print a; 

hello <td height=22 nowrap align="left"> 

hello 

a<b &#65; Alpha&Omega O

a<b A Alpha&Omega O 

M&eacute;xico

México

 

TokenizerFactories

KeywordTokenizerFactory

创建org.apache.lucene.analysis.core.KeywordTokenizer。这种分词器将整个字段看成一个分词。例如:"http://example.com/I-am+example?Text=-Hello"==> "http://example.com/I-am+example?Text=-Hello"

LetterTokenizerFactory

创建org.apache.lucene.analysis.LetterTokenizer。创建由连续的字母构成的字符串所形成的分词,所有非字母的字符将被丢弃。例如"I can't"==> "I", "can", "t"。

WhitespaceTokenizerFactory

创建org.apache.lucene.analysis.WhitespaceTokenizer。这种分词器将创建由空白符分割的由字符构成的分词。利用空白符作为分词的依据。

LowerCaseTokenizerFactory

创建org.apache.lucene.analysis.LowerCaseTokenizer.分词器。这种分词器将所有字母转换成小写,并丢弃掉所有的非字母字符。例如:"I can't"==> "i", "can", "t"

StandardTokenizerFactory

创建org.apache.lucene.analysis.standard.StandardTokenizer分词器。一个好的通用目的的分词器能够将许多无关的字串分开,并将分词的值设置成有意义的值串。分词类型只有对接下来的分词过滤器相关才是有意义。

ClassicTokenizerFactory

创建org.apache.lucene.analysis.standard.ClassicTokenizer。这个分词器保持了StandardTokenizer分词器的3.1版本前的特性。

UAX29URLEmailTokenizerFactory

创建org.apache.lucene.analysis.standard.UAX29URLEmailTokenizer。如同StandardTokenizer分词器,这个分词器依据Unicode standard annex UAX#29实现了单词边界规则。另外,这个分词器识别:识别全URLs使用file://, http(s)://, and ftp://模式,识别注册为顶级域名的主机名;识别IPv4和IPv6协议地址;识别e-mail地址。另外,除了标准分词器的输出外,该分词器还能够输出URL和E-mail地址类型。例如:

"Visithttp://accarol.com/contact.htm?from=external&a=10 or e-mailbob.cratchet@accarol.com"

==>ALPHANUM:"Visit",URL:"http://accarol.com/contact.htm?from=external&a=10",ALPHANUM:"or", ALPHANUM:"e-mail"EMAIL:"bob.cratchet@accarol.com"

 

PatternTokenizerFactory

将文本按照指定的规则表达式进行分割。例如,有一个用分号和若干空格分隔的短语列表:mice; kittens; dogs.

<fieldTypename="semicolonDelimited" class="solr.TextField">

   <analyzer>

      <tokenizerclass="solr.PatternTokenizerFactory" pattern=";\s*" />

   </analyzer>

</fieldType>

PathHierarchyTokenizerFactory

按照文件路径架构进行输出。

<fieldTypename="text_path" class="solr.TextField"positionIncrementGap="100">

    <analyzer>

      <tokenizerclass="solr.PathHierarchyTokenizerFactory" delimiter="\"replace="/"/>

    </analyzer>

</fieldType>

Input String

Output Tokens

Position Inc

/usr/local/apache

/usr

/usr/local

/usr/local/apache

1

0

0

c:\usr\local\apache

(w/ delimiter="\" replace="/")

c:

c:/usr

c:/usr/local

c:/usr/local/apache

1

0

0

0

 

ICUTokenizerFactory

Solr3.1使用ICU文本边界能力进行分词。该分词器首先识别文档内的书写系统。然后,它开始依赖书写系统并根据规则或字典进行分词。例如,如果它碰到了泰文,它将基于字典分段去分割文本。

Input String

Output Tokens

Script Attribute

Testing บริษัทชื่อ נאסק"ר

Testing

บริษัท

ชื่อ

נאסק"ר

Latin

Thai

Thai

Hebrew

    <fieldType name="text_icu"class="solr.TextField"autoGeneratePhraseQueries="false">

      <analyzer>

        <tokenizerclass="solr.ICUTokenizerFactory"/>

      </analyzer>

    </fieldType>

注意:为了使用这种分词器,请看solr/contrib/analysis-extras/README.txt文件,并根据文件说明,将需要的jars包放到你的SOLR_HOME/lib下。

 

 

TokenFilterFactories

ClassicFilterFactory

创建org.apache.lucene.analysis.standard.ClassicFilter。该过滤器从首字符缩略词中移除点号(.),并从词尾移除’S.该过滤器只对ClassicTokenizer或等价的分词器产生的特定类型的分词有效。例如在ClassicTokenizer后使用ClassicFilter,产生的处理效果如下:

"I.B.M. cat's can't"==> "IBM", "cat", "can't"

ApostropheFilterFactory

Createsorg.apache.lucene.analysis.tr.ApostropheFilter。该过滤器将撇号(‘)后面的所有字符(包括其自身)都脱除掉。例如:"Türkiye'de","2003'te" ==> "Türkiye", "2003".

LowerCaseFilterFactory

创建org.apache.lucene.analysis.LowerCaseFilter。将每个分词的字母均转换成小写,并保留非字母字符。例如:"I.B.M.","Solr" ==> "i.b.m.", "solr"。

TypeTokenFilterFactory

创建 org.apache.lucene.analysis.core.TypeTokenFilter。指定一个特定的黑名单或白名单分词列表。分词可以附带类型元数据。例如,UAX29URLEmailTokenizer产生<URL>和<EMAIL>类型的分词,以及其他任何类型。为了从文本分词中摘除e-mail地址,可以如下定义:

<fieldTypename="emails" class="solr.TextField"sortMissingLast="true" omitNorms="true">

      <analyzer>

        <tokenizerclass="solr.UAX29URLEmailTokenizerFactory"/>

        <filterclass="solr.TypeTokenFilterFactory" types="email_type.txt"

 useWhitelist="true"/>

      </analyzer>

</fieldType>

email_type.txt文件包含<EMAIL>地址,如果useWhitelist缺省值false,将按照黑名单进行操作。

TrimFilterFactory

创建org.apache.solr.analysis.TrimFilter.移除分词前后的空白符。例如:

" Kittens!   ", "Duck" ==>"Kittens!", "Duck".

TruncateTokenFilterFactory

创建org.apache.lucene.analysis.miscellaneous.TruncateTokenFilter。该过滤器可将短语截断到指定长度。

<filterclass="solr.TruncateTokenFilterFactory"prefixLength="5"/>

例如:"abcdefg","1234567" ==> "abcde", "12345"。

PatternCaptureGroupFilterFactory

按照正则表达式为每个捕获组生成分词。例如,下面的定义将输入文本http://www.foo.com/index分词成“http://www.foo.com”和www.foo.com

<fieldTypename="url_base" class="solr.TextField"positionIncrementGap="100">

     <analyzer>

       <tokenizer class="solr.KeywordTokenizerFactory"/>

       <filterclass="solr.PatternCaptureGroupFilterFactory"

pattern="(https?://([a-zA-Z\-_0-9.]+))"preserve_original="false"/>

     </analyzer>

</fieldType>

如果没有匹配的模式,或者preserve_original设置成true,原始词条也会形成一个新的分词。

PatternReplaceFilterFactory

与PatternReplaceCharFilterFactory类似,只是在分词之后操作。

StopFilterFactory

创建org.apache.lucene.analysis.StopFilter。丢弃掉一些常见的单词。可以通过schema里的words属性来设置一个用户自定义的停止词列表(stop word list)。可选地,“ignoreCase”属性可以用于忽略掉分词的大小写当和stopword list进行比较时。

<fieldtype name="teststop"class="solr.TextField">

   <analyzer>

     <tokenizerclass="solr.LowerCaseTokenizerFactory"/>

     <filterclass="solr.StopFilterFactory" words="stopwords.txt"ignoreCase="true"/>

   </analyzer>

</fieldtype>

英语中默认的停止词如下所示。下面这个是words属性引用的文件的格式:

#Standard english stopwords taken from Lucene's StopAnalyzer

a

an

and

are

as

at

be

……

CommonGramsFilterFactory

创建org.apache.solr.analysis.CommonGramsFilter。

通过组合常规分词(通常和stopword list一样)和规则分词构建查询词条。CommonGramsFilter通常在查询阶段是非常有用的。通常查询短语如果包含stopword是不能命中目标的。查询“the cat ”将与所有包含“cat”的文档相匹配,但这并不是实际期望的行为。短语查询并不按期望的工作,如果两个邻接的单词被当成一个短语进行索引的话,例如the_cat 被索引成一个词条。CommonGramsQueryFilter将查询短语“the cat“转换成单一词条the_cat。

一个自定义的常规单词列表可以通过words属性在schema.xml中指定。”ignoreCase”是一个可选的属性,通过该属性可以设置与common words list比较时是否忽略掉大小写。

<fieldtypename="testcommongrams" class="solr.TextField">

   <analyzer>

     <tokenizerclass="solr.LowerCaseTokenizerFactory"/>

     <filterclass="solr.CommonGramsFilterFactory" words="stopwords.txt"

ignoreCase="true"/>

   </analyzer>

</fieldtype>

EdgeNGramFilterFactory

创建org.apache.solr.analysis.EdgeNGramTokenFilter。缺省情况下,从输入分词的开始边界创建n-grams。根据配置,”Nigerian”字符串值将被分成如下的词条:

Nigerian =>"ni", "nig", "nige", "niger","nigeri", "nigeria", "nigeria","nigerian".

缺省条件下,minGramSize属性值为1,maxGramSize属性值为1,而且开始端是次的左侧。也可以设置side为back,以便从右侧向左生成分词。

minGramSize属性,第一个产生的分词的字符个数。例如minGramSize=4意味着一个像Apache这样的单词将生成Apac,Apach,Apache三个分词输出。

这个过滤器对于匹配前缀子串或后缀子串是非常有用的。通常在索引阶段使用。Edge n-gram分析可以在索引或查询阶段(或二者同时),然而如例子中所示,通常在索引阶段生成n-gram更有价值,在索引阶段生成n-grams,并在同一位置生成索引。在查询阶段,查询术语可以直接与n-grams匹配,无需做n-gram分析。不像通配符,n-gram查询短语可以在引用阶段使用。

<fieldTypename="text_general_edge_ngram" class="solr.TextField"

positionIncrementGap="100">

   <analyzer type="index">

      <tokenizerclass="solr.LowerCaseTokenizerFactory"/>

      <filter class="solr.EdgeNGramFilterFactory"minGramSize="2"

maxGramSize="15"side="front"/>

   </analyzer>

   <analyzer type="query">

      <tokenizerclass="solr.LowerCaseTokenizerFactory"/>

   </analyzer>

</fieldType>

KeepWordFilterFactory

创建org.apache.solr.analysis.KeepWordFilter。根据列表生成保留字。这个过滤器的行为与StopFilterFactory的正好相反。Words属性的文件格式是相同的。

<fieldtypename="testkeep" class="solr.TextField">

   <analyzer>

     <filterclass="solr.KeepWordFilterFactory" words="keepwords.txt"ignoreCase="true"/>

  </analyzer>

</fieldtype>

LengthFilterFactory

创建solr.LengthFilter。将所有不在min和max属性包含范围内的分词过滤掉。

<fieldtypename="lengthfilt" class="solr.TextField">

  <analyzer>

    <tokenizerclass="solr.WhitespaceTokenizerFactory"/>

    <filter class="solr.LengthFilterFactory"min="2" max="5" />

  </analyzer>

</fieldtype>

WordDelimiterFilterFactory

创建solr.analysis.WordDelimiterFilter。将由分隔符连接的单词组合分成单词,并对分解后的结果执行优化转换。缺省情况下,单词组合按照如下规则进行分割:

在字间分隔符(所有非字母、数字字符)处进行分割:”Wi-Fi” à ”Wi“,“Fi”

在大小写转换处进行分割(可以通过splitOnCaseChange进行关闭):”PowerShot”à”Power”, “Shot”

在字母-数字发生变换时进行分割(可以通过splitOnNumberics属性进行关闭):”SD500”à“SD”,“500”

每个子字的首尾字间分隔符将被忽略:"//hello---there,'dude'" -> "hello", "there", "dude"

尾随的‘s将从每个字词移除(可以通过stemEnglishPossessive参数设置关闭)"O'Neil's" ->"O", "Neil",这一步在分割过滤器中并不执行,因为可能的单词组合。

一些参数影响到该分词器的效果。

splitOnCaseChange="1"causes lowercase => uppercase transitions to generate a new part [Solr 1.3]:

◦"PowerShot"=> "Power" "Shot"

◦"TransAM"=> "Trans" "AM"

◦default is true("1"); set to 0 to turn off

•splitOnNumerics="1"causes alphabet => number transitions to generate a new part [Solr 1.3]:

◦"j2se"=> "j" "2" "se"

◦default is true("1"); set to 0 to turn off

•stemEnglishPossessive="1"causes trailing "'s" to be removed for each subword.

◦"Doug's"=> "Doug"

◦default is true("1"); set to 0 to turn off

也有一些参数影响出现在最终输出中的分词,以及分词结果是否会被组合:

generateWordParts="1"causes parts of words to be generated:

◦"PowerShot"=> "Power" "Shot" (if splitOnCaseChange=1)

◦"Power-Shot"=> "Power" "Shot"

◦default is 1

•generateNumberParts="1"causes number subwords to be generated:

◦"500-42"=> "500" "42"

◦default is 1

•catenateWords="1"causes maximum runs of word parts to be catenated:

◦"wi-fi"=> "wifi"

◦default is 0

•catenateNumbers="1"causes maximum runs of number parts to be catenated:

◦"500-42"=> "50042"

◦default is 0

•catenateAll="1" causesall subword parts to be catenated:

◦"wi-fi-4000"=> "wifi4000"

◦default is 0

•preserveOriginal="1"causes the original token to be indexed without modifications (in addition tothe tokens produced due to other options)

◦default is 0

•protected="protwords.txt"specifies a text file containing a list of words that should be protected andpassed through unchanged.

◦default is empty (noprotected words)

•types="wdfftypes.txt"allows customized tokenization for this filter. The file should exist in thesolr/conf directory, and entries are of the form (without quotes) "% =>ALPHA" or "\u002C => DIGIT". Allowable types are: LOWER,UPPER, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值