需要从servlet脱机运行Lucene Analyzer

时间:2011-04-12 07:08:27

标签: java lucene

这可能是一个非常棘手的问题,但我的问题是我有一个用于实时搜索的Spring servlet。我需要去除Lucene分析器,使其脱机运行,每次查询进入时都由servlet调用,而不是让分析器在servlet中。但是,我不太清楚如何执行此操作,并从servlet调用分析器服务。有人能指出我正确的方向吗?

目前,我有这个:

RAMDirectory ramDirectory = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter indexWriter = new IndexWriter(ramDirectory, config);
Document document = new Document();

// TEST DATA
document.add(new Field("firstName", "John", Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("occupation", "Engineer", Field.Store.YES, Field.Index.ANALYZED));

document.add(new Field("firstName", "Mary", Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("occupation", "Field Engineer", Field.Store.YES, Field.Index.ANALYZED));

document.add(new Field("firstName", "Jamie", Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("occupation", "Primary teacher", Field.Store.YES, Field.Index.ANALYZED));
// END TEST DATA

indexWriter.addDocument(document);
indexWriter.optimize();
indexWriter.close();

IndexSearcher indexSearcher = new IndexSearcher(ramDirectory);
String[] fields = {"firstName", "occupation"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(null, fields, analyzer);
Query query = parser.parse(searchQuery);

// Parsing of results here

感谢。

1 个答案:

答案 0 :(得分:0)

为什么你发现你当前的设计在性能方面很差?你究竟遇到了什么问题?

我相信您正在寻找的是某种形式的进程间通信。想到的两个选项是:

  1. 同步:卸载到另一台服务器(HTTP或普通TCP)的处理,该服务器包含Lucene并使用查询结果进行响应。 这对扩展系统很有用,因为它可以让你轻松地将Lucene分离到另一台机器,但除此之外,没有立即的性能提升。

  2. 异步:将其卸载到某个其他进程侦听的队列(例如ZeroMQ),运行Lucene,然后通过其他队列返回结果。 如果你需要在另一端响应用户,那么这是不太有利的,并且在任何情况下都很难用java servlet实现(尽管如果有人不知道,我很乐意听到它)。