
在处理中文搜索时,合适的分词器选择对于提高搜索质量和用户体验至关重要。Apache Solr 是一个高性能的全文搜索引擎服务器,支持多种语言的文本处理,包括中文。本文将详细介绍如何在 Solr 中配置两个常用的中文分词器:IKAnalyzer 和 pinyinAnalyzer。

首先,需要从 GitHub 或其他可信源下载最新版本的 IKAnalyzer 相关 JAR 包。
IKAnalyzer JAR 文件复制到 Solr 核心的 lib 目录下。例如,如果你的核心名为 mycore,路径可能是 solr-8.x.x/server/solr/mycore/lib/。solr-8.x.x/server/solr/mycore/conf/schema.xml 文件,添加以下内容:< fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>http://localhost:8983/solr/mycore/analysis)来测试 text_ik 字段类型的分词效果。同样,从 GitHub 或其他可信源下载 pinyin4j 的 JAR 包。
pinyin4j JAR 文件复制到 Solr 核心的 lib 目录下。solr-8.x.x/server/solr/mycore/conf/schema.xml 文件,添加以下内容:< fieldType name="text_pinyin" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="com.chenlb.mmseg4j.solr.MMsegTokenizerFactory" mode="complex"/>
<filter class="com.github.benmanes.caffeine.cache.SolrPinyinFilterFactory"
keepFirstPinyin="false" keepFullPinyin="true" keepNonePinyinWord="true"
keepOriginalWord="true" nonePinyinWordReplacement="" />
</analyzer>
</fieldType>http://localhost:8983/solr/mycore/analysis)来测试 text_pinyin 字段类型的分词效果。为了同时利用 IKAnalyzer 的分词能力和 pinyinAnalyzer 的拼音转换功能,可以在 schema.xml 中定义一个新的字段类型,结合两者的优势:
<fieldType name="text_ik_pinyin" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
<filter class="com.github.benmanes.caffeine.cache.SolrPinyinFilterFactory"
keepFirstPinyin="false" keepFullPinyin="true" keepNonePinyinWord="true"
keepOriginalWord="true" nonePinyinWordReplacement="" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
<filter class="com.github.benmanes.caffeine.cache.SolrPinyinFilterFactory"
keepFirstPinyin="false" keepFullPinyin="true" keepNonePinyinWord="true"
keepOriginalWord="true" nonePinyinWordReplacement="" />
</analyzer>
</fieldType>在使用Apache Solr进行全文搜索时,为了支持中文分词和拼音分词,通常会配置IKAnalyzer和PinyinAnalyzer。以下是如何在Solr中配置这两个分析器的示例代码。

首先,确保你已经下载了IKAnalyzer的jar包,并将其放置在Solr的lib目录下。然后,在solrconfig.xml文件中添加对IKAnalyzer的支持。
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-analysis-extras-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib/" regex=".*\.jar" />
<requestHandler name="/update" class="solr.UpdateRequestHandler">
<lst name="defaults">
<str name="update.chain">ik</str>
</lst>
</requestHandler>
<searchComponent name="query" class="solr.QueryComponent">
<lst name="defaults">
<str name="df">content</str>
</lst>
</searchComponent>
<schemaFactory class="ManagedIndexSchemaFactory">
<lst name="managedSchemaResourceName">
<str name="name">managed-schema</str>
</lst>
</schemaFactory>
<updateProcessor class="org.apache.solr.update.processor.AnalysisErrorHandlingUpdateProcessorFactory" name="ik">
<lst name="defaults">
<str name="errorHandler">ignore</str>
</lst>
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</updateProcessor>在schema.xml文件中定义字段类型和字段,使用IKAnalyzer进行分词。
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="content" type="text_ik" indexed="true" stored="true" multiValued="false" />同样,确保你已经下载了PinyinAnalyzer的jar包,并将其放置在Solr的lib目录下。然后,在solrconfig.xml文件中添加对PinyinAnalyzer的支持。
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-analysis-extras-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib/" regex=".*\.jar" />
<requestHandler name="/update" class="solr.UpdateRequestHandler">
<lst name="defaults">
<str name="update.chain">pinyin</str>
</lst>
</requestHandler>
<searchComponent name="query" class="solr.QueryComponent">
<lst name="defaults">
<str name="df">content_pinyin</str>
</lst>
</searchComponent>
<schemaFactory class="ManagedIndexSchemaFactory">
<lst name="managedSchemaResourceName">
<str name="name">managed-schema</str>
</lst>
</schemaFactory>
<updateProcessor class="org.apache.solr.update.processor.AnalysisErrorHandlingUpdateProcessorFactory" name="pinyin">
<lst name="defaults">
<str name="errorHandler">ignore</str>
</lst>
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.pinyin.PinyinTokenizerFactory" keepFirstPinyin="true" keepFullPinyin="true" keepNonePinyin="true" keepOriginal="true" limitFirstPinyinLength="8" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.pinyin.PinyinTokenizerFactory" keepFirstPinyin="true" keepFullPinyin="true" keepNonePinyin="true" keepOriginal="true" limitFirstPinyinLength="8" />
</analyzer>
</updateProcessor>在schema.xml文件中定义字段类型和字段,使用PinyinAnalyzer进行分词。
<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.pinyin.PinyinTokenizerFactory" keepFirstPinyin="true" keepFullPinyin="true" keepNonePinyin="true" keepOriginal="true" limitFirstPinyinLength="8" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.pinyin.PinyinTokenizerFactory" keepFirstPinyin="true" keepFullPinyin="true" keepNonePinyin="true" keepOriginal="true" limitFirstPinyinLength="8" />
</analyzer>
</fieldType>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="content_pinyin" type="text_pinyin" indexed="true" stored="true" multiValued="false" />完成上述配置后,重启Solr服务以使配置生效。
你可以通过Solr的管理界面或API来测试分词效果。例如,使用以下命令索引一些文档:
curl 'http://localhost:8983/solr/your_core_name/update?commit=true' -H 'Content-type:application/json' -d '
[
{"id": "1", "content": "中文分词测试"},
{"id": "2", "content_pinyin": "zhong wen fen ci ce shi"}
]'然后查询这些文档,验证分词是否按预期工作:
curl 'http://localhost:8983/solr/your_core_name/select?q=content:中文分词'
curl 'http://localhost:8983/solr/your_core_name/select?q=content_pinyin:zhong wen'在处理中文搜索时,通常需要使用专门的中文分词器来提高搜索的准确性和效率。IKAnalyzer 和 pinyinAnalyzer 是两个常用的中文分词器。
IKAnalyzer 是一个开源的、基于Java的中文分词器,它提供了标准分词和智能分词两种模式。以下是如何在 Solr 中配置 IKAnalyzer 的步骤:
ik-analyzer-xxx.jar 文件。ik-analyzer-xxx.jar 文件复制到 Solr 的 lib 目录中,例如:$SOLR_HOME/server/solr-webapp/webapp/WEB-INF/lib/。schema.xml 文件: schema.xml 文件,通常位于 $SOLR_HOME/server/solr/configsets/_default/conf/ 目录下。IKAnalyzer 的定义:<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>useSmart 参数用于控制分词模式: false 表示标准分词模式。true 表示智能分词模式。schema.xml 中定义使用 text_ik 字段类型的字段,例如:<field name="content" type="text_ik" indexed="true" stored="true"/>pinyinAnalyzer 是一个用于将中文转换为拼音的分词器,常用于拼音搜索和排序。以下是如何在 Solr 中配置 pinyinAnalyzer 的步骤:
pinyin4j-xxx.jar 文件。pinyin4j-xxx.jar 文件复制到 Solr 的 lib 目录中,例如:$SOLR_HOME/server/solr-webapp/webapp/WEB-INF/lib/。schema.xml 文件: schema.xml 文件,通常位于 $SOLR_HOME/server/solr/configsets/_default/conf/ 目录下。pinyinAnalyzer 的定义:<fieldType name="text_pinyin" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="com.github.lzj960515.pinyin4solr.PinyinFilterFactory" keepFirstPinyin="true" keepFullPinyin="true" keepNonePinyinWord="true" keepOriginalWord="true" keepSeparateFirstLetter="true" keepJointFirstLetter="true"/>
</analyzer>
</fieldType>keepFirstPinyin:是否保留每个汉字的首拼音。keepFullPinyin:是否保留每个汉字的全拼音。keepNonePinyinWord:是否保留非拼音词。keepOriginalWord:是否保留原始词。keepSeparateFirstLetter:是否保留每个汉字的首字母(分开)。keepJointFirstLetter:是否保留每个汉字的首字母(连在一起)。schema.xml 中定义使用 text_pinyin 字段类型的字段,例如:<field name="name" type="text_pinyin" indexed="true" stored="true"/>完成上述配置后,重启 Solr 以使配置生效:
$SOLR_HOME/bin/solr restart通过以上步骤,你可以在 Solr 中成功配置和使用 IKAnalyzer 和 pinyinAnalyzer,从而提高中文搜索的准确性和效率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。