Java 需要从servlet脱机运行Lucene Analyzer

Java 需要从servlet脱机运行Lucene Analyzer,java,lucene,Java,Lucene,这可能是一个很有意义的问题,但我的问题是我有一个用于实时搜索的SpringServlet。我需要去掉Lucene分析器,这样它就可以脱机运行,并且在每次查询进入时都会被servlet调用,而不是让分析器在servlet中。但是,我不太知道如何做到这一点,并从servlet调用analyzer服务。谁能给我指出正确的方向吗 目前,我有以下几点: RAMDirectory ramDirectory = new RAMDirectory(); StandardAnalyzer analyzer = n

这可能是一个很有意义的问题,但我的问题是我有一个用于实时搜索的SpringServlet。我需要去掉Lucene分析器,这样它就可以脱机运行,并且在每次查询进入时都会被servlet调用,而不是让分析器在servlet中。但是,我不太知道如何做到这一点,并从servlet调用analyzer服务。谁能给我指出正确的方向吗

目前,我有以下几点:

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

谢谢。

为什么您觉得当前的设计在性能方面很差?你到底遇到了什么问题

我相信您需要的是某种形式的进程间通信。我想到的两个选项是:

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

  • 异步:将其卸载到其他进程侦听、运行Lucene的队列(例如ZeroMQ),然后通过其他队列返回结果。 如果您需要对另一端的用户做出响应,那么这就不那么有利了,而且在任何情况下都很难用java servlet实现(尽管如果有人知道其他情况,我很想听听)


  • 请澄清:您是希望将Lucene作为一个单独的进程运行,侦听某个套接字并从servlet调用它,还是希望将LuceneAnalyzer on-demand作为一个新的进程从servlet启动?您好,对不起,我希望它作为一个单独的进程运行。请确保我正确地获得了您需要的工作流:(1)servlet接收http请求(2)将处理卸载到单独的lucene进程(3)从lucene获取结果(4)响应用户。这就是总的想法吗?是的,就是这样。我已经让它在servlet中工作,但我意识到这在性能方面是糟糕的设计。