Solr分词器
一,什么是solr分词器?
前面已经提到过,Solr是一个高性能的全文检索服务,基于Apache Lucene的,Lucene是一个用Java编写的开源的信息检索库,为全文索引和搜索提供了基础功能。 在Solr中,分词器(Tokenizer)是分析器(Analyzer)的一部分,用于将文本字段分割成单独的词汇单元或标记(tokens),这些标记是构成索引的基本元素,决定了哪些内容可以被搜索到。
二,分词器的作用
- 文本分割: 将一段连续的文本按照一定的规则拆分成一个个独立的,有意义的单词或者字符序列
- 降低复杂度: 通过分词,可以使查询更加高效,因为查询时也是根据同样的分词规则来匹配相应的标记;
- 提高准确性: 合适的分词可以让搜索结果更加的准确,因为不同的语言有不同的语法结构和词汇使用习惯
三,配置分词器
在solr中配置多种分词器可以通过编辑 schema.xml 或 managed-schema 文件来实现,这取决于你使用的Solr版本,从Solr 5.0 开始,默认使用managed-schema文件,它提供了通过solr的RESTful API来管理模式的能力,而不需要直接编辑xml文件
如何配置:
3.1 选择合适的分析链
- 确定哪些字段需要进行分词处理
- 决定是否需要为不同的语言或者内容类型配置不同的分词器
3.2 编辑schema文件
- 如果使用的时Solr 5.0 以上的版本,通过Solr admin UI 或者Solr 的REST ful API 来修改managed-schema 文件
- 对于更早的版本,可以通过编辑conf/schema.xml文件
3.3 定义字段类型
- 在chema.xml 文件或者managed-schema中添加元素
- 每个可以可以包含一个或者多个分析器(Analyzer),每个分析器可以指定不同场景下的分词器(Tokenizer)和过滤器(Filter)。例如,索引时和查询时可能需要不同的分词规则
元素中的type属性用来指定分析器应用于文本的不同阶段。Solr的分析过程可以分为索引(indexing)和查询(quering)两个主要的阶段,在这两个阶段中,文本可能需要用不同的方式来处理,所以type属性有下面几种常见的值:- Index:
- 当type="index"时,表示改分析器配置将用于索引全文时对字段内容进行分析。
- 这个类型的分析器决定了如何将原始数据转换成索引中的词汇单元(tokens),以便后续搜索
- query:
- 当type="query"时,表示该分析器配置将用于解析用户输入的查询字符串。
- 查询分析器通常会执行和索引分析器类似的步骤,但有时可能会有所不同,比如在查询时应用额外的同义词扩展或者停用词过滤等优化。
- first_phase, second_phase(适用于某些特定的分词器,如PathHierarchyTokenizerFactory)
- 某些特殊的分词器可能支持多阶段分析,这允许更复杂的文本处理逻辑
- first_phase 和second_phase分别指定了第一阶段和第二阶段的分析规则
- default或者省略type属性
- 如果没有明确的指定type属性,或者将其设置为default,那么该分析器配置将同时应用于索引和查询两个阶段
- 这意味着索引时和查询时都将使用相同的分词和过滤规则
选择适当的type值对于确保你的搜索应用能够正确地工作非常重要。例如,如果你的索引分析器移除了停用词,而查询分析器没有这么做,那么包含这些停用词的查询就可能无法匹配到相应的文档。同样的,如果查询分析器添加了同义词扩展,但是索引分析器没有做同样的事,那么你可能会得到过多的不准确的结果
为了实现最佳的搜索体验,通常建议根据具体需求分别配置索引个查询分析器,来确保两者之间的匹配度最高。此外,Solr提供了一个叫做analysis 的页面工具, 可以帮助你测试不同分析器配置,并查看他们是如何处理给定文本的。
3.4 添加分词器和过滤器
- 在每个标签的内部,可以定义和一系列的
- 分词器负责将文本分割成词汇单元,而过滤器则用于进一步处理这些词汇单元,如转换为小写,去除停用词等
3.5 关联字段与字段类型
- 定义好字段类型后,需要创建或者更新对应的元素,并将其type属性设置为你刚刚创建的字段类型名称
3.6 重启solr或者重新加载核心
- 修改完配置后,如果是在schema.xml中做出的更改,通常需要重启solr或者重新加载受影响的核心(Core)来让更改生效
- 如果是通过Solr admin UI或者 managed-schema,一般情况下会立即生效
一下是一个solr中配置了一个支持中文分词的字段类型
<fieldType name="text_zh" calss="solr.TextField">
<analyzer>
<!-- 使用smart Chinese 分词器-->
<tokenizer class= 'solr.smartcn.SmartChineseSentenceTokenizerFactory'/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
然后再创建一个字段 并使用这个字段类型
<field name="content_zh" type="text_zh" indexed="true" stored="true">
再实际的配置中会根据你的需求和使用的具体分词库有所不同。