Необходимо запустить Lucene Analyzer в автономном режиме от сервлета - PullRequest
0 голосов
/ 12 апреля 2011

Это может быть довольно сложный вопрос, но моя проблема в том, что у меня есть сервлет Spring, который используется для поиска в реальном времени. Мне нужно удалить анализатор Lucene, чтобы он работал в автономном режиме и вызывался сервлетом каждый раз, когда к нему поступал запрос, вместо того, чтобы иметь анализатор в сервлете. Тем не менее, я не совсем знаю, как это сделать, и вызвать службу анализатора из сервлета. Кто-нибудь может указать мне правильное направление?

На данный момент у меня есть это:

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 голосов
/ 12 апреля 2011

Почему вы считаете ваш текущий дизайн плохим с точки зрения производительности? С какой именно проблемой вы сталкиваетесь?

Я считаю, что вы ищете какую-то форму межпроцессного взаимодействия. На ум приходят два варианта:

  1. Синхронный: обработка разгрузки на другой сервер (HTTP или обычный TCP), который окружает Lucene и отвечает результатами запроса. Это будет полезно для масштабирования вашей системы, поскольку позволяет легко отделить Lucene от другой машины, но, кроме этого, мгновенного прироста производительности нет.

  2. Асинхронный: выгрузить его в очередь (например, ZeroMQ), которую слушает другой процесс, запустить Lucene, а затем вернуть результат через какую-то другую очередь. Это менее выгодно, если вам нужно ответить пользователю на другом конце, и в любом случае это будет трудно реализовать с помощью Java-сервлетов (хотя, если кто-то знает иначе, я бы хотел услышать об этом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...