在Solr中使用中文分词

简介:

使用全文检索,中文分词是离不开的,这里我采用的是 mmseg4j 分词器。mmseg4j分词器内置了对solr的支持,最新版本可支持4.X版本的sorl,使用起来很是方便。

下载mmseg4j

GoogleCode地址:http://code.google.com/p/mmseg4j/

请下载最新版本:mmseg4j-1.9.1,然后将mmseg4j-1.9.1/dist下的jar包拷贝至solr.war的lib目录,例如:apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib/

配置schema.xml

使用mmseg4j中文分词器,首先需要在schema.xml文件中配置一个fieldType节点:

<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">
    <analyzer> 
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" />
    </analyzer>
</fieldType>

然后就可以在field节点中引用该filedType了,假设你有个字段叫content需要支持中文分词,则需要定义示例filed节点如下:

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

接下来,重启solr服务器。

测试

我这里使用的是broadleaf项目(broadleaf是什么,请参考:BroadLeaf项目搜索功能改进)中的schema.xml,需要修改成如下:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
    <fields>
        <field name="namespace" type="string" indexed="true" stored="true" />
        <field name="id" type="string" indexed="true" stored="true" />
        <field name="productId" type="long" indexed="true" stored="true" />
        <field name="category" type="long" indexed="true" stored="true" multiValued="true" />
        <field name="explicitCategory" type="long" indexed="true" stored="true" multiValued="true" />
        <field name="searchable" type="text_zh" indexed="true" stored="false" />
        <field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
        <dynamicField name="*_searchable" type="text_zh" indexed="true" stored="true" />
        
        <dynamicField name="*_i" type="int" indexed="true" stored="true" />
        <dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_s" type="text_zh" indexed="true" stored="true" />
        <dynamicField name="*_ss" type="text_zh" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_l" type="long" indexed="true" stored="true" />
        <dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_t" type="text_zh" indexed="true" stored="true" />
        <dynamicField name="*_txt" type="text_zh" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_b" type="boolean" indexed="true" stored="true" />
        <dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_d" type="double" indexed="true" stored="true" />
        <dynamicField name="*_ds" type="double" indexed="true" stored="true" multiValued="true" />
        <dynamicField name="*_p" type="double" indexed="true" stored="true" />

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

        <!-- some trie-coded dynamic fields for faster range queries -->
        <dynamicField name="*_ti" type="tint" indexed="true" stored="true" />
        <dynamicField name="*_tl" type="tlong" indexed="true" stored="true" />
        <dynamicField name="*_td" type="tdouble" indexed="true" stored="true" />
        <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true" />
    </fields>
    
    <uniqueKey>id</uniqueKey>

    <types>
		<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">
			<analyzer> 
				<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" />
			</analyzer>
		</fieldType>
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" />
        <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" />
        <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" />
        <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" />
        <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0" />

        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
        </fieldType>
    </types>
</schema>

接下来,在浏览器中进行测试,输入下面url:

http://192.168.56.123:8080/solr/primary_shard2_replica1/select?q=*%3A*&wt=json&indent=true&rows=6&start=0&fq=category%3A2002&fq=namespace%3Ad&fq=%7B%21tag%3Da%7D%28en_US_name_s%3A大理%29

以上搜索的是category=2002,namespace=d,en_US_name_s=大理的记录,查询结果为:

{
  "responseHeader":{
    "status":0,
    "QTime":20},
  "response":{"numFound":1,"start":0,"maxScore":1.0,"docs":[
      {
        "namespace":"d",
        "id":"5",
        "productId":5,
        "explicitCategory":[2002],
        "category_2002_sort_i":4,
        "category":[2002,
          1,
          2],
        "price_p":480.0,
        "en_US_name_t":"大理风情",
        "en_name_t":"大理风情",
        "en_US_name_s":"大理风情",
        "en_name_s":"大理风情",
        "en_US_desc_t":"体验不一样的风景",
        "en_desc_t":"体验不一样的风景",
        "en_US_ldesc_t":"大理风情养老基地坐落在美丽的洱海边,这里依山傍水,鲜花遍地,适合老年人居住、旅游。",
        "en_ldesc_t":"大理风情养老基地坐落在美丽的洱海边,这里依山傍水,鲜花遍地,适合老年人居住、旅游。",
        "en_US_city_t":"5329",
        "en_city_t":"5329",
        "en_US_city_i":5329,
        "en_city_i":5329,
        "en_US_hotelType_t":"A",
        "en_hotelType_t":"A",
        "en_US_hotelType_s":"A",
        "en_hotelType_s":"A",
        "en_US_county_t":"532901",
        "en_county_t":"532901",
        "en_US_county_i":532901,
        "en_county_i":532901,
        "en_US_estatePrice_p":480.0,
        "en_estatePrice_p":480.0,
        "_version_":1462514915941023744}]
  }}

通过查询结果,可以知道:只搜索”大理”关键字,可以查询出en_US_name_s为”大理风情”的记录。

目录
相关文章
Halcon中关于角度计算和测量拟合的算子详解
Halcon中关于角度计算和测量拟合的算子详解
2246 0
|
2月前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
1774 120
|
6天前
|
人工智能 JSON 监控
Spring AI MCP Server接入百炼问题排查
本文记录Spring AI MCP Server接入阿里云百炼平台时因HTTP连接复用导致的"获取工具异常,请确认MCP是否正常运行"问题。百炼复用连接时,服务端已关闭通道,导致请求体丢失。通过分析日志发现Netty过早关闭连接,最终以添加`Connection: close`响应头强制断开,解决兼容性问题。
90 6
|
2月前
|
数据采集 敏捷开发 安全
数据资产运营:从资源到资本的价值跃迁之路
在数字经济时代,数据已成为关键生产要素。本文提出“数据资产运营框架”,涵盖价值路径、战略体系与基础支撑,推动数据从资源到资本的跃迁,助力企业实现数字化转型与价值创新。
216 7
|
前端开发 JavaScript 小程序
前端新机遇!为什么我建议学习鸿蒙?
【10月更文挑战第4天】前端新机遇!为什么我建议学习鸿蒙?
605 0
前端新机遇!为什么我建议学习鸿蒙?
|
11月前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
5811 4
|
11月前
|
机器学习/深度学习 人工智能 算法
昇腾AI行业案例(一):基于AI图像处理的疲劳驾驶检测
在本实验中,您将学习如何使用利用CV(Computer Vision)领域的AI模型来构建一个端到端的疲劳驾驶检测系统,并使用开源数据集进行效果验证。为此,我们将使用昇腾的AI硬件以及CANN等软件产品。
509 3
|
小程序 Java 关系型数据库
基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)
|
机器学习/深度学习 人工智能 网络架构
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
284 1
|
UED 开发者
鸿蒙next版开发:ArkTS组件通用属性(禁用控制)
在HarmonyOS 5.0中,ArkTS引入了禁用控制属性,允许开发者控制组件的可用状态,提升用户界面的交互性和响应性。本文详细解读了ArkTS中组件的禁用控制属性,并提供了示例代码,展示了如何使用`disabled`属性来禁用按钮等可交互组件,从而防止用户误操作、引导用户流程和提升用户体验。
431 4