lucene索引搜索

iphone 2011-08-15 03:29:42
是这样的,我要索引数据库的数据,,xml文件中的。我想利用lucene对所有XML文件进行全文搜索,比如一个学生库,输入学生ID后,能够找出所有与这个姓名相关的所有信息,查询结果能像数据库中查询到的记录一样。

初识lucene,看过网上很多相关介绍与使用,到现在还不清楚lucene能否满足我这样的需求,发送到望各位网上朋友指点一二!谢谢了。
...全文
56 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xifanmax 2011-08-16
  • 打赏
  • 举报
回复
这个读取文件夹内txt文件建立索引的示例:
//定义存放索引的目录 。
File indexDir = new File("D:\\luceneIndex");
//测试用法的一种,对目录中的txt文件的内容进行索引,供查询。
File dataDir = new File("D:\\luceneData");

//确定分词的实现方法。这是Lucene自带的分词器
//Analyzer writerAnalyzer = new SimpleAnalyzer(Version.LUCENE_33);
//庖丁解牛 建立中文分词解析
Analyzer writerAnalyzer = new PaodingAnalyzer();
//
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_33, writerAnalyzer);
//设定是对索引增量,还是新建索引。
indexWriterConfig.setOpenMode(OpenMode.CREATE);
//索引写入流
IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir),indexWriterConfig);

File[] dataFiles = dataDir.listFiles();
long startTime = new Date().getTime();
for(int i = 0; i < dataFiles.length; i++){
if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
Document document = new Document();
FileInputStream fileInputStream = new FileInputStream(dataFiles[i]);
InputStreamReader reader = new InputStreamReader(fileInputStream,"GBK");

document.add(new Field("path",dataFiles[i].getCanonicalPath(),Field.Store.YES,Field.Index.ANALYZED));
document.add(new Field("filename",dataFiles[i].getName(),Field.Store.YES,Field.Index.ANALYZED,TermVector.WITH_POSITIONS_OFFSETS));
document.add(new Field("contents",reader,TermVector.WITH_POSITIONS_OFFSETS));
indexWriter.addDocument(document);
}
}
//对IndexWriter进行优化
indexWriter.optimize();
indexWriter.close();

搜索的代码

public static String IndexPath = "D:\\luceneIndex";
String queryStr = "中国中央电视台";

//读取索引
File indexDir = new File(IndexPath);
FSDirectory directory = FSDirectory.open(indexDir);
IndexSearcher searcher = new IndexSearcher(directory);
if (!indexDir.exists()) {
System.out.println("The Lucene index is not exist");
return;
}
//创建查询解析器
QueryParser queryParser = new QueryParser(Version.LUCENE_33,
"contents", new PaodingAnalyzer());
//创建查询对象
Query query = queryParser.parse(queryStr);

// Term term = new Term("contents", queryStr.toLowerCase());
// TermQuery query = new TermQuery(term);

TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
IndexReader indexReader = IndexReader.open(directory);
Document document = searcher.doc(scoreDocs[i].doc);
System.out.println("Name: " + document.get("filename"));
System.out.println("FilePath: " + document.get("path"));
//高亮处理
String text = ContentReader.readText(document.get("path"));

TermPositionVector tpv = (TermPositionVector) indexReader.getTermFreqVector(

scoreDocs[i].doc, "contents");

TokenStream ts = TokenSources.getTokenStream(tpv);

Formatter formatter = new Formatter() {

@Override
public String highlightTerm(String srcText, TokenGroup g) {

if (g.getTotalScore() <= 0) {

return srcText;

}

return "<b>" + srcText + "</b>";

}

};

Highlighter highlighter = new Highlighter(formatter, new QueryScorer(

query));

String result = highlighter.getBestFragments(ts, text, 5, "…");

System.out.println("result:\n\t" + result);

indexReader.close();
}
}
iphone 2011-08-15
  • 打赏
  • 举报
回复
我希望能够有详细的案例代码或者demo,因为我对这方面还是菜鸟!
xifanmax 2011-08-15
  • 打赏
  • 举报
回复
本人也初学lucene,楼主所说功能肯定可以实现。我的思路是这样,用dom4j解析所有xml,对需要搜索的字段或属性,建立索引,就行了。索引建立只需进行一次,除非xml内容有新增,则需对已建立的索引进行增量或重建。
有不对望大神们补充 - -
lord_is_layuping 2011-08-15
  • 打赏
  • 举报
回复
关注 帮顶起来

50,542

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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