共计 9874 个字符,预计需要花费 25 分钟才能阅读完成。
这篇文章主要介绍“solr schema.xml 和 solrconfig.xml 怎么配置”,在日常操作中,相信很多人在 solr schema.xml 和 solrconfig.xml 怎么配置问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”solr schema.xml 和 solrconfig.xml 怎么配置”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
一、字段配置(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,包括分词和过滤,如下:
view plain print ?
fieldType name = text_ws class = solr.TextField positionIncrementGap = 100
analyzer
tokenizer class = solr.WhitespaceTokenizerFactory /
/ analyzer
/ fieldType
fieldType name = text class = solr.TextField positionIncrementGap = 100
analyzer type = index
!– 这个分词包是空格分词,在向索引库添加 text 类型的索引时,Solr 会首先用空格进行分词
然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果,才会加入到索引库中以备查询。
注意:Solr 的 analysis 包并没有带支持中文的包,需要自己添加中文分词器,google 下。
—
tokenizer class = solr.WhitespaceTokenizerFactory /
!– in this example, we will only use synonyms at query time
filter class = 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 to leave a gap for more accurate phrase queries.
—
filter class = solr.StopFilterFactory
ignoreCase = true
words = stopwords.txt
enablePositionIncrements = true
/
filter class = solr.WordDelimiterFilterFactory generateWordParts = 1
generateNumberParts = 1 catenateWords = 1 catenateNumbers = 1
catenateAll = 0 splitOnCaseChange = 1 /
filter class = solr.LowerCaseFilterFactory /
filter class = solr.SnowballPorterFilterFactory language = English
protected = protwords.txt /
/ analyzer
analyzer type = query
tokenizer class = solr.WhitespaceTokenizerFactory /
filter class = solr.SynonymFilterFactory synonyms = synonyms.txt ignoreCase = true
expand = true /
filter class = solr.StopFilterFactory
ignoreCase = true
words = stopwords.txt
enablePositionIncrements = true
/
filter class = solr.WordDelimiterFilterFactory generateWordParts = 1
generateNumberParts = 1 catenateWords = 0 catenateNumbers = 0
catenateAll = 0 splitOnCaseChange = 1 /
filter class = solr.LowerCaseFilterFactory /
filter class = solr.SnowballPorterFilterFactory language = English
protected = protwords.txt /
/ analyzer
/ fieldType
2、再来看下 fields 节点内定义具体的字段(类似数据库的字段),含有以下属性:
name:字段名
type:之前定义过的各种 FieldType
indexed:是否被索引
stored:是否被存储(如果不需要存储相应字段值,尽量设为 false)
multiValued:是否有多个值(对可能存在多值的字段尽量设置为 true,避免建索引时抛出错误)
view plain print ?
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、建议建立一个拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索:
以下是拷贝设置:
view plain print ?
copyField source = name dest = all /
copyField source = summary dest = all /
4、动态字段,没有具体名称的字段,用 dynamicField 字段
如:name 为 *_i,定义它的 type 为 int,那么在使用这个字段的时候,任务以_i 结果的字段都被认为符合这个定义。如 name_i, school_i
view plain print ?
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、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:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。
name: 字段类型名
class: java 类名
indexed: 缺省 true。说明这个数据应被搜索和排序,如果数据没有 indexed,则 stored 应是 true。
stored: 缺省 true。说明这个字段被包含在搜索结果中是合适的。如果数据没有 stored, 则 indexed 应是 true。
sortMissingLast: 指没有该指定字段数据的 document 排在有该指定字段数据的 document 的后面
sortMissingFirst: 指没有该指定字段数据的 document 排在有该指定字段数据的 document 的前面
omitNorms: 字段的长度不影响得分和在索引时不做 boost 时,设置它为 true。一般文本字段不设置为 true。
termVectors: 如果字段被用来做 more like this 和 highlight 的特性时应设置为 true。
compressed: 字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有 StrField 和 TextField 是可以压缩,这通常适合字段的长度超过 200 个字符。
multiValued: 字段多于一个值的时候,可设置为 true。
positionIncrementGap: 和 multiValued
一起使用,设置多个值之间的虚拟空白的数量
tokenizer class = solr.WhitespaceTokenizerFactory /
空格分词,精确匹配。
filter class = solr.WordDelimiterFilterFactory generateWordParts = 1 generateNumberParts = 1 catenateWords = 1 catenateNumbers = 1 catenateAll = 0 splitOnCaseChange = 1 /
在分词和匹配时,考虑 – 连字符,字母数字的界限,非字母数字字符,这样 wifi 或 wi fi 都能匹配 Wi-Fi。
filter class = solr.SynonymFilterFactory synonyms = synonyms.txt ignoreCase = true expand = true /
同义词
filter class = solr.StopFilterFactory ignoreCase = true words = stopwords.txt enablePositionIncrements = true /
在禁用字(stopword)删除后,在短语间增加间隔
stopword:即在建立索引过程中(建立索引和搜索)被忽略的词,比如 is this 等常用词。在 conf/stopwords.txt 维护。
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 的默认值应该就已经足够。
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 schema.xml 和 solrconfig.xml 怎么配置”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!