lucene完全满足你的要求。你最好到它的论坛和jguru上去看。中文和office文档现在都可支持。中文问题大富翁有相关答案,如果你要代码,我也可以贴上来。
目前来说,它是很好的一个搜索引擎。
我们可以共同研究。^_^

解决方案 »

  1.   

    谢谢yakuu提供的信息。
    解决中文问题的代码有吗?拜托了。
    我在lucene的相关论坛上看过,可是,我想对于office文档来说还是要像pdf一样,自己来从数据流中提取文字信息吧?
    有free的代码吗?
      

  2.   

    呵呵,接:
    //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 < STOP_WORDS.length; i++)
                stopTable.put(STOP_WORDS[i], STOP_WORDS[i]);
        }
        public final Token next() throws java.io.IOException {
            for (Token token = input.next(); token != null; token = input.next()) {
                String text = token.termText();
                if (stopTable.get(text) == null) {
                    switch (Character.getType(text.charAt(0))) {
                    case Character.LOWERCASE_LETTER:
                    case Character.UPPERCASE_LETTER:
                        // English word/token should larger than 1 character.
                        if (text.length()>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.javapackage 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;
        }
    }
      

  3.   

    我看了上面的程序,是不是以单个汉字作为token?没有字典吗?
    还有,这段程序应该还是解惜不了office文档吧.
      

  4.   

    近看程序中的中文处理有三个问题
    1.没有见中文的“的 了 你 我 ”等常用自过滤掉。
    2.因为遇到菲alpha字符就把当作一个汉字返回,这样会把很多中文标点和控制符号也作为token存入index文件。
    3.西文的词可以由alpha字符隔断,但是,对于中文,因为词与词之间没有分隔符,所以必须用词典来分词。先试图找到字典中的最大匹配,在字典中没有任何匹配的情况下,才把单个子作为token返回。对于从office文档 pdf中提取text,大家有何高见。好多pdftotext convert都是不支持中文的。
      

  5.   

    仅看程序,中文处理有三个问题:
    1.没有把中文的“的 了 你 我 ”等超过高频字过滤掉。
    2.因为遇到非alpha字符就把当它当作一个汉字返回,这样会把很多中文标点和控制符号也作为token存入index文件。
    3.西文的词可以由非alpha字符隔断,但是,对于中文,因为词与词之间没有分隔符,所以必须用词典来分词。先试图找到字典中的最大匹配,在字典中没有任何匹配的情况下,才把单个字作为token返回。对于从office文档 pdf中提取text,大家有何高见。好多pdftotext convert都是不支持中文的。
      

  6.   

    能不能搞定这个:http://www.csdn.net/expert/topic/842/842203.xml?temp=.1630518