Еще один потенциально неловкий вопрос. Пожалуйста, не стесняйтесь указывать на любое очевидное решение, которое могло быть упущено - я уже искал решения ранее и ничего не нашел, но иногда это вопрос выбора неправильных ключевых слов для поиска.
Вот ситуация: несколько месяцев назад я написал свой собственный RequestHandler для корпоративной системы, чтобы внедрить несколько необходимых параметров безопасности в качестве дополнительного фильтра во все запросы к ядру solr. Все идет гладко, пока часть, в которой документы, полученные в результате запроса к индексу, не будут собраны и затем возвращены пользователю.
По существу, после того, как фильтр создан и запрос выполнен, мы получаем набор идентификаторов документов (и баллов), но затем нам нужно перебирать идентификаторы, чтобы построить набор результатов, по одному удару за раз - что на 10 раз медленнее, чем запросы к стандартному обработчику запросов, и ухудшается только с увеличением числа результатов. Что еще хуже, поскольку наша схема в значительной степени зависит от динамических полей для обеспечения гибкости, нет способа (насколько мне известно) предварительного получения списка полей для извлечения по документу, кроме тестирования всех возможных комбинаций по документу.
Приведенный ниже код является упрощенной версией того, что работает в рабочей среде, для запроса SolrIndexSearcher и построения ответа.
Без лишних слов мои вопросы:
- Есть ли способ получить все результаты одновременно, вместо создания документа ответа по документу?
- есть ли возможность получить список полей для каждого результата вместо проверки всех возможных комбинаций?
- какие-нибудь конкретные WTF в этом коде, о которых я должен знать? Не стесняйтесь пнуть меня!
//function that queries index and handles results
private void searchCore(SolrIndexSearcher searcher, Query query,
Filter filter, int num, SolrDocumentList results) {
//Executes the query
TopDocs col = searcher.search(query,filter, num);
//results
ScoreDoc[] docs = col.scoreDocs;
//iterate & build documents
for (ScoreDoc hit : docs) {
Document doc = reader.document(hit.doc);
SolrDocument sdoc = new SolrDocument();
for(Object f : doc.getFields()) {
Field fd = ((Field) f);
//strings
if (fd.isStored() && (fd.stringValue() != null))
sdoc.addField(fd.name(), fd.stringValue());
else if(fd.isStored()) {
//Dynamic Longs
if (fd.name().matches(".*_l") ) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
long testLong = a.getLong(0);
sdoc.addField(fd.name(), testLong );
}
//Dynamic Dates
else if(fd.name().matches(".*_dt")) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
Date dt = new Date(a.getLong());
sdoc.addField(fd.name(), dt );
}
//...
}
}
results.add(sdoc);
}
}