当前位置:  技术问答>java相关

lucene中文检索

    来源: 互联网  发布时间:2015-06-27

    本文导语:  lucene只支持检索英文或象英文这种特点的语言. 而不支持中文检索. 不知哪位有好的解决方案或改进过的lucene支持中文检索. | 这个问题在年初就解决了。 我从大富翁的孙老大那学了不少。^_^ ...

lucene只支持检索英文或象英文这种特点的语言.
而不支持中文检索.
不知哪位有好的解决方案或改进过的lucene支持中文检索.

|
这个问题在年初就解决了。
我从大富翁的孙老大那学了不少。^_^

下面给你三个类,你看看:
//ChineseTokenizer.java

package org.apache.lucene.analysis.cn;

import java.io.Reader;
import org.apache.lucene.analysis.*;

public final class ChineseTokenizer extends Tokenizer {
    public ChineseTokenizer(Reader in) {
        input = in;
    }
    private int offset = 0, bufferIndex=0, dataLen=0;
    private final static int MAX_WORD_LEN = 255;
    private final static int IO_BUFFER_SIZE = 1024;
    private final char[] buffer = new char[MAX_WORD_LEN];
    private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
    private int length;
    private int start;
    private final void push(char c) {
        if (length == 0) start = offset-1;            // start of token
        buffer[length++] = Character.toLowerCase(c);  // buffer it
    }
    private final Token flush() {
        if (length>0) {
            //System.out.println(new String(buffer, 0, length));
            return new Token(new String(buffer, 0, length), start, start+length);
        }
        else
            return null;
    }

    public final Token next() throws java.io.IOException {
        length = 0;
        start = offset;
        while (true) {
            final char c;
            offset++;
            if (bufferIndex >= dataLen) {
                dataLen = input.read(ioBuffer);
                bufferIndex = 0;
            };
            if (dataLen == -1) return flush();
            else
                c = (char) ioBuffer[bufferIndex++];
            switch(Character.getType(c)) {
            case Character.DECIMAL_DIGIT_NUMBER:
            case Character.LOWERCASE_LETTER:
            case Character.UPPERCASE_LETTER:
                push(c);
                if (length == MAX_WORD_LEN) return flush();
                break;
            case Character.OTHER_LETTER:
                if (length>0) {
                    bufferIndex--;
                    return flush();
                }
                push(c);
                return flush();
            default:
                if (length>0) return flush();
                break;
            }
        }
    }
}

///////////////////////////////////////////////////////
//ChineseFilter.java

package org.apache.lucene.analysis.cn;

import java.io.Reader;
import java.util.Hashtable;
import org.apache.lucene.analysis.*;

public final class ChineseFilter extends TokenFilter {
    // Only English now, Chinese to be added later.
    public static final String[] STOP_WORDS = {
    "and", "are", "as", "at", "be", "but", "by",
    "for", "if", "in", "into", "is", "it",
    "no", "not", "of", "on", "or", "such",
    "that", "the", "their", "then", "there", "these",
    "they", "this", "to", "was", "will", "with"
    };
    private Hashtable stopTable;
    public ChineseFilter(TokenStream in) {
        input = in;
        stopTable = new Hashtable(STOP_WORDS.length);
        for (int i = 0; i 1) {
                        return token;
                    }
                    break;
                case Character.OTHER_LETTER:
                    // One Chinese character as one Chinese word.
                    // Chinese word extraction to be added later here.
                    return token;
                }
            }
        }
        return null;
    }
}

//////////////////////////////////////
//ChineseAnalyzer.java

package org.apache.lucene.analysis.cn;

import java.io.Reader;
import org.apache.lucene.analysis.*;

/**
 * Title: ChineseAnalyzer
 * Description:
 *   Subclass of org.apache.lucene.analysis.Analyzer
 *   build from a ChineseTokenizer, filtered with ChineseFilter.
 * Copyright:   Copyright (c) 2001
 * Company:
 * @author Yiyi Sun
 * @version 1.0
 *
 */

public class ChineseAnalyzer extends Analyzer {

    public ChineseAnalyzer() {
    }

    /**
    * Creates a TokenStream which tokenizes all the text in the provided Reader.
    *
    * @return  A TokenStream build from a ChineseTokenizer filtered with ChineseFilter.
    */
    public final TokenStream tokenStream(String fieldName, Reader reader) {
        TokenStream result = new ChineseTokenizer(reader);
        result = new ChineseFilter(result);
        return result;
    }
}

我后来做了一些修改,加入了自己的功能。这里就不贴出来了。^_^

希望对你有帮助。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java 全文搜索框架 Lucene
  • 文本搜索引擎 Zend Search Lucene
  • Lucene Index薄荷糖 LuciMint
  • Lucene搜索引擎封装 ExpressSearch
  • Lucene 扩展 LGTE
  • Maven Lucene Plugin
  • Lucene图片搜索 LIRE
  • lucene分组统计扩展组件 Bobo
  • Lucene和Oracle的集成方案 LDI
  • Lucene索引查看工具 Luke
  • Lucene4c
  • lucene + hadoop 分布式运行框架 Nut
  • Lucene 查询工具 LQT
  • 基于lucene 4.3的知识图谱搜索引擎XunTa (一种用"知识点"来找人的搜人引擎)
  • java Lucene 中自定义排序的实现


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    java开源软件 iis7站长之家