这可能是一个非常棘手的问题,但我的问题是我有一个用于实时搜索的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
感谢。
答案 0 :(得分:0)
为什么你发现你当前的设计在性能方面很差?你究竟遇到了什么问题?
我相信您正在寻找的是某种形式的进程间通信。想到的两个选项是:
同步:卸载到另一台服务器(HTTP或普通TCP)的处理,该服务器包含Lucene并使用查询结果进行响应。 这对扩展系统很有用,因为它可以让你轻松地将Lucene分离到另一台机器,但除此之外,没有立即的性能提升。
异步:将其卸载到某个其他进程侦听的队列(例如ZeroMQ),运行Lucene,然后通过其他队列返回结果。 如果你需要在另一端响应用户,那么这是不太有利的,并且在任何情况下都很难用java servlet实现(尽管如果有人不知道,我很乐意听到它)。