在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为”大理风情”的记录。

时间: 2024-10-26 06:26:36

在Solr中使用中文分词的相关文章

postgres中的中文分词zhparser

postgres中的中文分词zhparser postgres中的中文分词方法 基本查了下网络,postgres的中文分词大概有两种方法: Bamboo zhparser 其中的Bamboo安装和使用都比较复杂,所以我选择的是zhparser zhparse基于scws scws是简易中文分词系统的缩写,它的原理其实很简单,基于词典,将文本中的内容按照词典进行分词,提取关键字等.github上的地址在这里.它是xunsearch的核心分词系统. 而zhparser是基于scws来做的postgr

如何在android中使用中文分词

问题描述 如何在android中使用中文分词 大家好,我想要在android里面使用中文分词功能,要求实现分词功能的软件是开源软件,不知道有没有谁知道应该使用什么软件?谢谢了. 解决方案 http://www.chengxuyuans.com/Android/62017.html 解决方案二: android-apktool 中文使用说明android-apktool 中文使用说明

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题. 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-piny

NLP中的中文分词技术

随 着需求的变化和技术的发展,互联网企业对数据的分析越来越深入,尤其是自然语言处理处理领域,近几年,在搜索引擎.数据挖掘.推荐系统等应用方面,都向前 迈出了坚实的步伐.自然语言处理领域涉及的技术非常多,为了让对此领域感兴趣的同学能够快速入门,在这里介绍一下中文信息处理的基本技术:中文分词. 说分词是中文处理的基本技术,是由汉语的特点决定的.汉语的有些单字没有意义,多字合起来才有意义,比如烟囱的"囱","尬尴":有些是单字虽然有意义,但组合之后,意思发生改变,比如&q

深度学习将会变革NLP中的中文分词

雷锋网(公众号:雷锋网)按:本文转自ResysChina高翔,文章主要介绍了1)区分中文分词的方法:2)用深度学习的方法来解决中文分词的好处及其具体应用. 现有分词介绍 自然语言处理(NLP,Natural Language Processing)是一个信息时代最重要的技术之一,简单来讲,就是让计算机能够理解人类语言的一种技术.在其中,分词技术是一种比较基础的模块.对于英文等拉丁语系的语言而言,由于词之间有空格作为词边际表示,词语一般情况下都能简单且准确的提取出来.而中文日文等文字,除了标点符号

Drupal 7结合Apache Solr 4.7实现中文分词教程

Solr的版本升级较快,目前已经到5.x的版本,但是drupal的版本升级比较慢,因此关于Drupal升级使用solr高版本的问题,进展也比较慢,另外一个原因是Drupal的apachesolr模块是否支持也是一个问题,所以作者建议不要盲目的升级使用高版本,一定要测试之后才能在正式服务器上使用.     这次是参考网上的一些教程,把Apache Solr整合了中文分词,然后配合了Drupal的schema设置步骤,已经添加了自定义的中文分词器,对Drupal7以及中文分词做了支持. Solr4.

Lucene 3.6.2入门(14) SolrJ操作索引和搜索文档以及整合中文分词

package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.sol

ubuntu系统安装apachesolr及中文分词配置的方法

Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述 安装jdk与tomcat7 apt-get install openjdk-7-jdk apt-get install tomcat7 tomcat7-admin 下载并配置apachesolr http://archive.apache.org/dist/lucene/solr/ 下载如

Tiny中文分词

Maven引用坐标: ? 1 2 3 4 5 <dependency>   <groupId>org.tinygroup</groupId>   <artifactId>chinese</artifactId>   <version>0.0.12</version> </dependency> Tiny中文分词是本人一开始做的一个验证性开发,结果开发出来效果还非常不错,因此就加入到Tiny框架中. Tiny中文