Solr Custom RequestHandler - оптимизация результатов - PullRequest
0 голосов
/ 12 декабря 2011

Еще один потенциально неловкий вопрос. Пожалуйста, не стесняйтесь указывать на любое очевидное решение, которое могло быть упущено - я уже искал решения ранее и ничего не нашел, но иногда это вопрос выбора неправильных ключевых слов для поиска.
Вот ситуация: несколько месяцев назад я написал свой собственный 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);
    }
}  

1 Ответ

0 голосов
/ 14 декабря 2011

За запрос OP:

Хотя это не отвечает на ваш конкретный вопрос, я бы предложил другой вариант решения вашей проблемы.

Чтобы добавить фильтр ко всем запросам, вы можете добавить раздел «добавления» в StandardRequestHandler в файле SolrConfig.xml. Добавьте раздел «fl» (обозначает фильтр) и добавьте свой фильтр. К каждому запросу, передаваемому через StandardRequestHandler, автоматически добавляется фильтр.

Этот фильтр обрабатывается как любой другой, поэтому он кэшируется в FilterCache. Результатом является довольно быстрая фильтрация (через docIds) во время запроса. Это может позволить вам избежать необходимости использовать отдельные документы в вашем решении для применения критериев фильтрации.

...