`

solr1.4 中文 庖丁 使用方法

    博客分类:
  • solr
阅读更多

由于solr1.4使用Lucene 2.9.1 ,故需要修改庖丁源代码:net.paoding.analysis.analyzer.PaodingTokenizer

需要注意的有两点

1. 继承关系由 TokenStream 调整为 Tokenizer,因此需要删除变量

private final Reader input;

删除对应的关闭方法

public void close() throws IOException {
   super.close();
   input.close();
}

2. 高亮显示功能由于底层实现变化,故需要重写reset方法。原先reset 只是调整input。现在需要将多个值重置。

public void reset(Reader input) throws IOException {
   this.input = input;
   this.inputLength=0;
   this.offset=0;
   this.dissected=0;
   this.tokenIteractor=null;
   this.beef.set(0, 0);
}

 

调整后的整体代码如下

package net.paoding.analysis.analyzer;

/**
* Copyright 2007 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;

import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.Beef;
import net.paoding.analysis.knife.Collector;
import net.paoding.analysis.knife.Knife;
import net.paoding.analysis.knife.Paoding;

import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.Tokenizer;


/**
* PaodingTokenizer是基于“庖丁解牛”框架的TokenStream实现,为PaodingAnalyzer使用。
* <p>
*
* @author Zhiliang Wang [qieqie.wang@gmail.com]
* @see Beef
* @see Knife
* @see Paoding
* @see Tokenizer
* @see PaodingAnalyzer
*
* @see Collector
* @see TokenCollector
* @see MAxTokenCollector
* @see MostWordsTokenCollector
*
* @since 1.0
*/
public final class PaodingTokenizer extends Tokenizer implements Collector {

// -------------------------------------------------

/**
* 从input读入的总字符数
*/
private int inputLength;

/**
*
*/
private static final int bufferLength = 128;

/**
* 接收来自{@link #input}的文本字符
*
* @see #next()
*/
private final char[] buffer = new char[bufferLength];

/**
* {@link buffer}[0]在{@link #input}中的偏移
*
* @see #collect(String, int, int)
* @see #next()
*/
private int offset;

/**
*
*/
private final Beef beef = new Beef(buffer, 0, 0);

/**
*
*/
private int dissected;

/**
* 用于分解beef中的文本字符,由PaodingAnalyzer提供
*
* @see #next()
*/
private Knife knife;

/**
*
*/
private TokenCollector tokenCollector;

/**
* tokens迭代器,用于next()方法顺序读取tokens中的Token对象
*
* @see #tokens
* @see #next()
*/
private Iterator/* <Token> */ tokenIteractor;

// -------------------------------------------------

/**
*
* @param input
* @param knife
* @param tokenCollector
*/
public PaodingTokenizer(Reader input, Knife knife, TokenCollector tokenCollector) {
   this.input = input;
   this.knife = knife;
   this.tokenCollector = tokenCollector;
}

// -------------------------------------------------

public TokenCollector getTokenCollector() {
   return tokenCollector;
}

public void setTokenCollector(TokenCollector tokenCollector) {
   this.tokenCollector = tokenCollector;
}

// -------------------------------------------------


public void collect(String word, int offset, int end) {
   tokenCollector.collect(word, this.offset + offset, this.offset + end);
}

// -------------------------------------------------
public Token next() throws IOException {
   // 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据
   while (tokenIteractor == null || !tokenIteractor.hasNext()) {
    //System.out.println(dissected);
    int read = 0;
    int remainning = -1;//重新从reader读入字符前,buffer中还剩下的字符数,负数表示当前暂不需要从reader中读入字符
    if (dissected >= beef.length()) {
     remainning = 0;
    }
    else if (dissected < 0){
     remainning = bufferLength + dissected;
    }
    if (remainning >= 0) {
     if (remainning > 0) {
      System.arraycopy(buffer, -dissected, buffer, 0, remainning);
     }
     read = this.input.read(buffer, remainning, bufferLength - remainning);
     inputLength += read;
     int charCount = remainning + read;
     if (charCount < 0) {
      // reader已尽,按接口next()要求返回null.
      return null;
     }
     if (charCount < bufferLength) {
      buffer[charCount ++] = 0;
     }
     // 构造“牛”,并使用knife“解”之
     beef.set(0, charCount);
     offset += Math.abs(dissected);
     //offset -= remainning;
     dissected = 0;
    }
    dissected = knife.dissect((Collector)this, beef, dissected);
//    offset += read;// !!!
    tokenIteractor = tokenCollector.iterator();
   }
   // 返回tokensIteractor下一个Token对象
   return (Token) tokenIteractor.next();
}

public int getInputLength() {
   return inputLength;
}

//重新实现reset(input),切记需要抛出异常。
public void reset(Reader input) throws IOException {
   this.input = input;
   this.inputLength=0;
   this.offset=0;
   this.dissected=0;
   this.tokenIteractor=null;
   this.beef.set(0, 0);
}
}

 

 

另外,关于原先实现的中文切词中的create方法,需要修改返回的类型。代码如下

package net.paoding;

import java.io.Reader;
import java.util.Map;

import net.paoding.analysis.analyzer.PaodingTokenizer;
import net.paoding.analysis.analyzer.TokenCollector;
import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.PaodingMaker;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.solr.analysis.BaseTokenizerFactory;


/**
* Solr 1.4 paoding tokenizer factory
*
*/
public class ChineseTokenizerFactory extends BaseTokenizerFactory {

/**
* 最多分词,默认.
*/
public static final String MOST_WORDS_MODE = "most-words";

/**
* 最长分词.
*/
public static final String MAX_WORD_LENGTH_MODE = "max-word-length";

private String mode = null;

public void setMode(String mode) {
   if (mode==null||MOST_WORDS_MODE.equalsIgnoreCase(mode)
     || "default".equalsIgnoreCase(mode)) {

    this.mode=MOST_WORDS_MODE;
   } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {
    this.mode=MAX_WORD_LENGTH_MODE;
   } else {
    throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);
   }
}

    public void init(Map<String, String> args) {
        super.init(args);
        setMode(args.get("mode"));
    }

    public Tokenizer create(Reader input) {
    return new PaodingTokenizer(input, PaodingMaker.make(),createTokenCollector());
    }

    private TokenCollector createTokenCollector() {
        if( MOST_WORDS_MODE.equals(mode)) {
        return new MostWordsTokenCollector();
        }
        if( MAX_WORD_LENGTH_MODE.equals(mode)) {
        return new MaxWordLengthTokenCollector();
        }
        throw new Error("never happened");
    }
}

 

 

如需使用该分词器,则需要配置字段类型schema.xml 中的fieldType的tokenizer 为下面形式。具体class路径根据实际的ChineseTokenizerFactory位置填写。

<tokenizer class="net.paoding.ChineseTokenizerFactory" mode="most-words"/>

上面讲述的是solr 1.4配置庖丁的方式。如果您是从solr1.3升级,那么请务必注意下面这段文字:

如果是升级,则需要核对schema.xml 中的 field 的type 定义对应好(如果原来是 int 类型的要注意,solr 1.4 把 int 用 tint 类型了。如果要兼容,要把 int 的类型修改成 pint。其它 long,float 一样修改)具体对应关系可根据solr1.3的fieldType 中各种类型定义 与solr1.4中fieldType 各种类型定义对比。

 

文章出自幸福的小小仙 

xian0617@qq.comxian0617@163.com

分享到:
评论

相关推荐

    Solr 1.4 Enterprise Search Server.pdf

    ### Solr 1.4 企业搜索服务器:深入解析与应用 #### 一、Solr 1.4 概览 Solr 1.4 是一个功能强大的企业级搜索引擎平台,它基于Apache Lucene(一个高性能全文检索库)构建而成。Solr 1.4 版本在2009年由Packt ...

    Window下Solr1.4安装部署

    ### Window下Solr1.4安装部署的知识点详解 #### 一、Solr简介 Apache Solr 是一个高性能、基于Lucene的全文检索服务。它提供了丰富的功能集,包括高度可扩展性、易于部署和强大的搜索功能。Solr 1.4版本是在2009年...

    solr1.4教程

    总结来说,Solr1.4教程详细介绍了Solr的核心特性、工作原理和源码结构,旨在帮助开发者快速理解和掌握Solr的使用。通过学习本教程,读者可以具备搭建、配置和优化Solr搜索服务的能力,为企业的信息检索提供强大支持...

    apache solr server 1.4 pdf格式英文帮助文档

    ### Apache Solr 1.4 企业搜索服务器 #### 简介 Apache Solr 1.4 是一款高度可扩展、高性能的企业级搜索平台,它基于著名的全文搜索引擎库 Apache Lucene 构建而成。Solr 提供了丰富的功能集,如面向用户的分面导航...

    Solr_1.4_Enterprise_Search_Server.pdf

    《Solr 1.4企业级搜索服务器》一书详细介绍了Apache Solr 1.4版本,这是一个开源的、高性能的、全功能的企业级搜索平台。本书由David Smiley和Eric Pugh共同编写,旨在帮助读者掌握如何利用Solr增强搜索体验,包括...

    Packtpub.Solr.1.4.Enterprise.Search.Server.Aug.2009

    《Packtpub.Solr.1.4.Enterprise.Search.Server.Aug.2009》是一本专注于Solr 1.4的企业搜索服务器构建的专著。这本书详细介绍了如何利用Solr来创建高效、可扩展的搜索解决方案,适用于各种规模的企业。Solr是Apache ...

    solr5.5.4部署及使用

    在本文档中,我们将详细介绍如何部署和使用 Solr 5.5.4 版本,包括两种常见的部署方式:Jetty 和 Tomcat,并涉及到中文分词器IKAnalyzer的集成以及对Word文档的支持。 首先,我们需要准备合适的环境,这里要求的是...

    Solr(Cloudera)使用手册

    3. **加载中文分词jar包**:将中文分词器的jar包添加到Solr的lib目录下,以供Solr使用。 #### 六、监控Solr 监控Solr集群的状态对于及时发现和解决问题至关重要。 - **使用Cloudera Manager**:Cloudera Manager...

    solr的安装与使用

    Solr安装与使用 Solr是一款功能强大的搜索引擎,能够帮助我们快速搭建企业搜索平台。在本文中,我们将详细介绍Solr的安装和使用过程。 一、安装Solr 首先,我们需要下载Solr的安装包。这里我们使用的是Solr 1.3...

    solr-dataimportscheduler-1.4.jar 增量定时同步数据到solr.rar

    本压缩包“solr-dataimportscheduler-1.4.jar 增量定时同步数据到solr.rar”是针对Solr的一款实用工具,用于实现数据库数据的增量定时同步。这个jar包的核心功能是DataImportHandler(DIH),它是一个内置在Solr中的...

    solr定时增量更新jar包1.4

    Solr,全称为Apache Solr,是一款开源的全文搜索引擎,被广泛应用于企业级搜索...通过正确地配置和使用`apache-solr-dataimportscheduler-1.4.jar`,你可以有效地管理和维护Solr索引,确保搜索结果的准确性和时效性。

    apache-solr-dataimportscheduler-1.4

    solr6.1.0版本jar已经不再提供读取自动索引配置文件路径的方法,因此apache-solr-dataimportscheduler-1.0内调用该方法的所有操作都无法实现。于是需要下载apache-solr-dataimportscheduler-1.0-with-source.jar并...

    solr6.0中文分词

    IKAnalyzer 是一个广泛使用的开源中文分词器,它特别设计用于支持 Solr 和 Lucene(Solr 的底层搜索引擎库)等项目。IKAnalyzer 提供了强大的分词能力,能够处理复杂的中文语法和词汇,包括多音字、成语和新词发现。...

    Solr5.4中文分词

    通过以上步骤,我们就能在Solr 5.4中成功配置并使用中文分词库。这个过程对于提升中文文档的检索效率和准确性至关重要,因为正确的分词可以极大地提高搜索结果的相关性。同时,根据实际需求,还可以对分词库进行定制...

    solr中文解析器以及使用文档

    "solr中文解析器以及使用文档"这个主题主要涵盖了Solr在处理中文内容时的关键技术和实践。 1. **中文分词**:中文文本不像英文那样以空格作为单词的分隔符,因此在索引和搜索时需要进行分词处理。IK Analyzer是一个...

    solr在java中使用总结

    ### Solr在Java中的使用总结 #### 一、Solr简介 Solr是一个高性能的全文搜索引擎,基于Apache Lucene开发,使用Java 5编写。它不仅继承了Lucene的强大功能,还提供了更丰富的查询语言以及更好的性能优化。Solr具备...

    sorlr + tomcat+ 庖丁解牛中文分词 配置文档

    总结来说,这个配置文档应该包含了如何在Tomcat上部署Solr,以及如何配置Solr以使用庖丁解牛分词器进行中文处理的详细步骤。这对于需要处理大量中文数据的搜索应用开发者来说,是一份非常实用的参考资料。通过阅读...

Global site tag (gtag.js) - Google Analytics