Возникли проблемы с упорядочением результатов поиска с помощью Lucene

Я запускаю поисковый запрос следующим образом, чтобы получить результаты из Dynamics CRM. Поиск работает нормально, но выдает результаты, основанные на релевантности. Мы хотим упорядочить их в порядке убывания поля «создано». Поскольку мы отображаем только 10 результатов на странице, я не могу отсортировать результат, возвращаемый этим запросом.

Есть ли способ заказать на основе поля?

public IEnumerable<SearchResult> Search(string term, int? pageNumber, int 
        pageSize, out int totalHits, IEnumerable<string> logicalName)
{
    var searchProvider = SearchManager.Provider;
    var query = new CrmEntityQuery(term, pageNumber.GetValueOrDefault(1), pageSize, logicalNames);

    return GetSearchResults(out totalHits, searchProvider, query);        
}

private IEnumerable<SearchResult> GetSearchResults(out int totalHits, 
                 SearchProvider searchProvider, CrmEntityQuery query)
{
    using (ICrmEntityIndexSearcher searcher = searchProvider.GetIndexSearcher())
    {                
        Portal.StoreRequestItem("SearchDeduplicateListForAuthorisation", new List<Guid>());
        var results = searcher.Search(query);
        totalHits = results.ApproximateTotalHits;

        return from x in results
             select new SearchResult(x);
    }
}

person Scorpion    schedule 26.06.2015    source источник


Ответы (1)


Сам Lucene не использовал, поэтому не могу прокомментировать это.

Однако, если вы делали это в базовой CRM. Вы бы использовали QueryExpression с OrderExpression. Затем, когда вы просматриваете результаты, они выводятся по порядку.

Вот пример QueryExpression с OrderExpression и пейджингом.

Страница больших наборов результатов с помощью QueryExpression

Предположительно, в какой-то момент данные извлекаются из CRM либо в Lucene, либо в ваш собственный код, может быть, в CrmEntityQuery? Затем вы можете добавить сортировку туда.

person James Wood    schedule 26.06.2015
comment
Благодарю. На самом деле я ищу несколько запросов, таких как (kbArticle, веб-страницы, инциденты и т. д.). Поэтому, если я использую QueryExpression, я думаю, что это будет очень дорогой запрос. - person Scorpion; 26.06.2015
comment
Как же Lucene извлекает данные из CRM? Предположительно, либо через вызов веб-службы, и в этом случае у него будет такая же проблема с производительностью. Возможно, он идет прямо на SQL? В этом случае вы применяете порядок к SQL-запросу. Учитывая, что Lucene — это библиотека для поисковых систем, я был бы удивлен, если бы она не поддерживала упорядочение результатов. Непонятно, где здесь настоящая проблема. - person James Wood; 26.06.2015
comment
Нет, я не думаю, что Lucene поддерживает заказ. lucene.apache.org/core/2_9_4/queryparsersyntax.html#Fuzzy Поиски - person Scorpion; 26.06.2015
comment
Как Lucene получает данные, которые затем ищет? - person James Wood; 26.06.2015
comment
SearchProvider портала ADX использует Lucene, и я не могу подтвердить, как они выполняют запросы внизу, но они должны использовать веб-службы CRM. Поставщик поиска может индексировать любой объект, настроенный с помощью представления с именем Поиск портала. - person Scorpion; 26.06.2015
comment
Даже если я запущу Query Expression для извлечения результатов из всех рассматриваемых сущностей, как будет работать пейджинг? - person Scorpion; 26.06.2015