solr 4.0已正式发布了
正式版本
更新发送到集群中的任何节点上,都可以自动转发到正确的索引shard片上,每一个replication都会做更新,并同时写tLog文件,当服务重启时会同步tlog。
查询发送到任何一个节点上都会变成发布给集群上执行,并自动负载平衡和故障转移
web管理界面UI的修改
solrCloud在事务日志方面的性能优化,结点同步的恢复,集群状态的高速缓存以上的优化
Pivot Faceting 支持多层的 facet。
Pseudo-fields 支持重命名字段,包括输出函数值。
拼写检查支持直接从主索引里取数据。
Join,支持查询关系其它 schema 的 document。
增强 Function query 支持条件函数、文本相关性函数。
新的更新处理器,支持在做索引之前更新 document。
新的 admin web 界面,支持 SolrCloud。
Pivot Faceting 支持多层的 facet。
Pseudo-fields 支持重命名字段,包括输出函数值。
拼写检查支持直接从主索引里取数据。
Join,支持查询关系其它 schema 的 document。
增强 Function query 支持条件函数、文本相关性函数。
新的更新处理器,支持在做索引之前更新 document。
新的 admin web 界面,支持 SolrCloud
一、字段配置(schema)
schema.xml位于solr/conf/目录下,类似于数据表配置文件,
定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。
1、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。
name:就是这个FieldType的名称。
class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
<schema name="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,包括分词和过滤,如下:
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.WhitespaceTokenizerFactory"/> </analyzer> </fieldType>
2、再来看下fields节点内定义具体的字段(类似数据库的字段),含有以下属性:
name:字段名
type:之前定义过的各种FieldType
indexed:是否被索引
stored:是否被存储(如果不需要存储相应字段值,尽量设为false)
multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)
<field name="name" type="text" indexed="true" stored="true" />
3、建议建立一个拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索:
以下是拷贝设置:
<copyField source="name" dest="all"/>
<copyField source="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
为了索引字段的最小化和搜索的效率,将所有的 text fields的index都设置成field,然后使用copyField将他们都复制到一个总的 text field上,
然后对他进行搜索。删除所有不必要的copyField声明
为了最大化搜索效率,使用java编写的客户端与solr交互(使用流通信)
在服务器端运行JVM(省去网络通信),使用尽可能高的Log输出等级,减少日志量。
2、<schema name="example" version="1.2">
name:标识这个schema的名字
version:现在版本是1.2
3、filedType
<fieldType name="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的数据排在有该field的数据之后,而不管请求时的排序规则。
sortMissingFirst="true",跟上面倒过来呗。
2个值默认是设置成false
StrField类型不被分析,而是被逐字地索引/存储。
StrField和TextField都有一个可选的属性“compressThreshold”,保证压缩到不小于一个大小(单位:char)
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括 一个分词器(tokenizer)和多个过滤器(filter)
positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。
<tokenizer class="solr.WhitespaceTokenizerFactory" />
空格分词,精确匹配。
4、fields
<field name="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:如果没有属性需要修改,就可以用这个标识下。
<field name="text" type="text" indexed="true" stored="false" multiValued="true" />
包罗万象(有点夸张)的field,包含所有可搜索的text fields,通过copyField实现。
<copyField source="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种不同的方式来建立索引。
<dynamicField name="*_i" type="int" indexed="true" stored="true" />
如果一个field的名字没有匹配到,那么就会用动态field试图匹配定义的各种模式。
"*"只能出现在模式的最前和最后
较长的模式会被先去做匹配
如果2个模式同时匹配上,最先定义的优先
<dynamicField name="*" type="ignored" multiValued="true" />
如果通过上面的匹配都没找到,可以定义这个,然后定义个type,当String处理。(一般不会发生)
但若不定义,找不到匹配会报错。
5、其他一些标签
<uniqueKey>id</uniqueKey>
文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。
<defaultSearchField>text</defaultSearchField>
如果搜索参数中没有指定具体的field,那么这是默认的域。
<solrQueryParser defaultOperator="OR" />
配置搜索参数短语间的逻辑,可以是"AND|OR"。
二、solrconfig.xml
1、索引配置
mainIndex 标记段定义了控制Solr索引处理的一些因素.
useCompoundFile:通过将很多 Lucene 内部文件整合到单一一个文件来减少使用中的文件的数量。
这可有助于减少 Solr 使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄,
否则 false 的默认值应该就已经足够。
mergeFacor:决定Lucene段被合并的频率。较小的值(最小为2)使用的内存较少但导致的索引时间也更慢。
较大的值可使索引时间变快但会牺牲较多的内存。(典型的 时间与空间 的平衡配置)
maxBufferedDocs:在合并内存中文档和创建新段之前,定义所需索引的最小文档数。
段 是用来存储索引信息的Lucene文件。较大的值可使索引时间变快但会牺牲较多内存。
maxMergeDocs:控制可由Solr合并的 Document 的最大数。较小的值(<10,000)最适合于具有大量更新的应用程序
maxFieldLength:对于给定的Document,控制可添加到Field的最大条目数,进而阶段该文档。
如果文档可能会很大,就需要增加这个数值。然后,若将这个值设置得过高会导致内存不足错误。
unlockOnStartup:告知Solr忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,
索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。
将其设置为true可以禁用启动索引,进而允许进行添加和更新。(锁机制)
2、查询处理配置
query标记段中以下一些与缓存无关的特性:
maxBooleanClauses:定义可组合在一起形成以个查询的字句数量的上限。正常情况1024已经足够
。如果应用程序大量使用了通配符或范围查询,增加这个限制将能避免当值超出时,抛出TooMangClausesException。
enableLazyFieldLoading:如果应用程序只会检索Document上少数几个Field,那么可以将这个属性设置为true。
懒散加载的一个常见场景大都发生在应用程序返回一些列搜索结果的时候,用户常常会单击其中的一个来查看存储在此索引中的原始文档。
初始的现实常常只需要现实很短的一段信息。若是检索大型的Document,除非必需,否则就应该避免加载整个文档。
query部分负责定义与在Solr中发生的时间相关的几个选项:
概念:Solr(实际上是Lucene)使用称为Searcher的Java类来处理Query实例。Searcher将索引内容相关的数据加载到内存中。
根据索引、CPU已经可用内存的大小,这个过程可能需要较长的一段时间。要改进这一设计和显著提高性能,
Solr引入了一张“温暖”策略,即把这些新的Searcher联机以便为现场用户提供查询服务之前,先对它们进行“热身”。
newSearcher和firstSearcher事件,可以使用这些事件来制定实例化新Searcher或第一个Searcher时,
应该执行哪些查询。如果应用程序期望请求某些特定的查询,那么在创建新Searcher或第一个Searcher时就应该反注释这些部分并执行适当的查询。
query中的智能缓存:
filterCache:通过存储一个匹配给定查询的文档 id 的无序集,过滤器让 Solr 能够有效提高查询的性能。
缓存这些过滤器意味着对Solr的重复调用可以导致结果集的快速查找。
更常见的场景是缓存一个过滤器,然后再发起后续的精炼查询,这种查询能使用过滤器来限制要搜索的文档数。
queryResultCache:为查询、排序条件和所请求文档的数量缓存文档 id 的有序集合。
documentCache:缓存Lucene Document,使用内部Lucene文档id(以便不与Solr唯一id相混淆)。
由于Lucene的内部Document id 可以因索引操作而更改,这种缓存不能自热。
Named caches:命名缓存是用户定义的缓存,可被 Solr定制插件 所使用。
其中filterCache、queryResultCache、Named caches(如果实现了org.apache.solr.search.CacheRegenerator)可以自热。
每个缓存声明都接受最多四个属性:
class:是缓存实现的Java名
size:是最大的条目数
initialSize:是缓存的初始大小
autoWarmCount:是取自旧缓存以预热新缓存的条目数。如果条目很多,就意味着缓存的hit会更多,只不过需要花更长的预热时间。
对于所有缓存模式而言,在设置缓存参数时,都有必要在内存、cpu和磁盘访问之间进行均衡。
统计信息管理页(管理员界面的Statistics)对于分析缓存的 hit-to-miss 比例以及微调缓存大小的统计数据都非常有用。
而且,并非所有应用程序都会从缓存受益
。实际上,一些应用程序反而会由于需要将某个永远也用不到的条目存储在缓存中这一额外步骤而受到影响。
Solr相关概念详解:SolrRequestHandler
1. standard (StandardRequestHandler)
标准查询分析器使用SolrQuerySyntax通过q参数来指定查询,它要求被很好的组织(Formed),或返回一个异常。
对于精确查询和任意复杂的查询,使用Standard效果很好。
2. dismax ( DismaxRequestHandler ):
dismax查询分析器是一个为用户提供的更宽容的查询分析器,查询字符串直接传递一个q参数。
其他参数可以很容易搜索横跨多个Field,使用Disjunctions和不严格的短语查询返回高度相关的结果。
standard和Dismax的区别:
Standard要求输入的查询内容符合SolrQuerySyntax查询语法,特殊字符要进行转义。如果不符合语法,
会报错。Dismax查询就不会存在这样的问题,对于用户的输入始终都不会报错。
相关推荐
该书全面地介绍了Solr的功能和工作原理,不仅适合初学者,也适合那些希望深化理解Solr高级特性的开发者。书中详细讲解了索引构建、查询处理、分布式搜索、集群管理、实时添加以及Solr与Hadoop的集成等内容,深入浅出...
- **SolrCloud模式**:Solr 4.0引入的新特性,支持分布式索引和查询,提供高可用性和容错性。 - **请求处理器(Request Handler)**:处理HTTP请求,如搜索请求、更新请求等。 - **查询解析器(Query Parser)**:...
文档还提到了 "schemaless 模式",这是 Solr 4.0 以后引入的一个重要特性,允许用户无需定义字段模式即可进行索引操作,大大简化了使用门槛。 此外,还涉及了 "分词器、分析器和过滤器" 的使用和配置,它们是实现...
- **SolrCloud**:从Solr 4.0开始引入,提供了分布式搜索和处理能力,允许多台Solr服务器组成集群,实现数据的自动分片、复制和故障恢复。 3. **配置文件**: - **solrconfig.xml**:这是Solr实例的主要配置文件...
自Solr 4.0版本开始,Solr引入了SQL查询接口,使得对Solr的数据操作更加接近传统的数据库操作。在Solr 7.1.0中,你可以使用`SolrSQLRequest`和`SolrSQLParser`来执行SQL查询。例如,以下代码展示了如何执行一个简单...
另外,为了实现对Solr 4.0的兼容性,mmseg4j-for-solr项目可能已经针对Solr 4.0的API进行了适配,确保了与旧版本的Solr无缝对接。这意味着即使你的Solr服务器是4.0版本,也能顺利使用mmseg4j进行中文分词。 在实际...
3. **云部署**: 自Solr 4.0起引入了SolrCloud模式,6.6.2版本中也包含此功能,允许用户在Zookeeper的协调下创建分布式Solr集群,提供了容错和自动恢复能力。 4. **实时索引**: Solr支持实时索引,即新增或更新文档...
1. **SolrCloud**:从4.0版本开始,Solr引入了分布式搜索和处理能力,称为SolrCloud。它允许Solr实例在Hadoop的Zookeeper协调下形成集群,实现数据的分布存储和处理,支持自动故障转移和负载均衡。 2. **索引与查询...
SolrCloud是自Solr 4.0版本起引入的一种全新的分布式搜索方案。它采用了Zookeeper作为协调服务,以实现高度可伸缩和高可用性的搜索服务。相比于传统的单机或多机Master-Slave部署方式,SolrCloud具有以下显著特点: ...
3. **分布式搜索**:SolrCloud是Solr的分布式搜索和索引分片功能,但在1.4.0版本中,Solr尚未集成这一特性。不过,可以通过设置多个独立的Solr实例实现基本的分布式部署。 4. **实时索引**:Solr支持实时索引,即新...
在4.0到5.0的升级过程中,Solr引入了大量的新特性和改进,这些变化主要体现在以下几个方面: 1. **Cloud功能增强**:SolrCloud是Solr的分布式搜索和索引存储解决方案,4.10.3版本对SolrCloud进行了优化,提供了更...
SolrCloud是Solr4.0版本开发出的具有开创意义的基于Solr和Zookeeper的分布式搜索方案,或者可以说,SolrCloud是Solr的一种部署方式。Solr可以以多种方式部署,例如单机方式,多机Master-Slaver方式,这些方式部署的...
1. **SolrCloud**: 从4.0版本开始,Solr引入了分布式搜索和管理的SolrCloud模式,支持Zookeeper进行集群协调,实现了数据的自动分片、复制和故障转移。在4.10.3中,这一特性已经相当成熟,可以为大型系统提供高可用...
- **性能优化**:利用Solr的批量操作特性提高数据导入速度,或通过缓存机制减少不必要的网络通信。 标签“全文索引”和“solr3.5”强调了EasyNet.Solr库的核心功能和所兼容的Solr版本。全文索引是Solr的一个关键...
- Solr4.0版本的SolrCloud可以独立运行或与其他系统集成。 - 在学习SolrCloud特性前,应该重置所有配置并移除指南文档。 - 如果需要使用不同于默认的端口号(如Solr默认使用端口8983),需要查阅solr.xml注解中的...
### Lucene4.0 IK分词器使用概览 #### IKAnalyzer:中文分词利器 IKAnalyzer是一款基于Java开发的开源中文分词工具包,自2006年首次发布以来,历经多个版本的迭代,已成为业界广泛认可的中文分词解决方案。其最初...
SolrCloud是Apache Solr的一个特性,自4.0版本开始引入。它提供了分布式搜索和处理的能力,支持数据的分片、复制和故障转移,以实现高可用性和水平扩展。SolrCloud依赖Zookeeper作为其集群管理和协调中心。 2. **...