全文检索引擎,求教:

ThisFellow 2002-06-29 06:42:17
我需要一种全文检索引擎,要求:
1.免费,开放源码
2.java
3.支持中英文
4.支持对 .txt,.html,.pdf,.doc等多种文档的检索。

我已经试用了lucene和基于lucene的j2a websearch,但是问题是一不支持中文,二不支持对ms-office文档。

有没有能够满足我的要求的引擎?
我可不想用数据库内建的全文检索,因为我要考虑各个数据库之间的可移植性。
...全文
25 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ThisFellow 2002-07-01
  • 打赏
  • 举报
回复
我看了上面的程序,是不是以单个汉字作为token?没有字典吗?
还有,这段程序应该还是解惜不了office文档吧.
hanry 2002-07-01
  • 打赏
  • 举报
回复
能不能搞定这个:

http://www.csdn.net/expert/topic/842/842203.xml?temp=.1630518
ThisFellow 2002-07-01
  • 打赏
  • 举报
回复
仅看程序,中文处理有三个问题:
1.没有把中文的“的 了 你 我 ”等超过高频字过滤掉。
2.因为遇到非alpha字符就把当它当作一个汉字返回,这样会把很多中文标点和控制符号也作为token存入index文件。
3.西文的词可以由非alpha字符隔断,但是,对于中文,因为词与词之间没有分隔符,所以必须用词典来分词。先试图找到字典中的最大匹配,在字典中没有任何匹配的情况下,才把单个字作为token返回。

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

对于从office文档 pdf中提取text,大家有何高见。好多pdftotext convert都是不支持中文的。
yakuu 2002-06-30
  • 打赏
  • 举报
回复
呵呵,接:
//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.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;
}
}
ThisFellow 2002-06-30
  • 打赏
  • 举报
回复
谢谢yakuu提供的信息。
解决中文问题的代码有吗?拜托了。
我在lucene的相关论坛上看过,可是,我想对于office文档来说还是要像pdf一样,自己来从数据流中提取文字信息吧?
有free的代码吗?
yakuu 2002-06-29
  • 打赏
  • 举报
回复
lucene完全满足你的要求。你最好到它的论坛和jguru上去看。

中文和office文档现在都可支持。

中文问题大富翁有相关答案,如果你要代码,我也可以贴上来。
目前来说,它是很好的一个搜索引擎。
我们可以共同研究。^_^
jaguarcts 2002-06-29
  • 打赏
  • 举报
回复
gz

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧