description |
---|
Querying in views with IPublishedContentQuery in Umbraco |
The IPublishedContentQuery
interface contains different query methods for accessing strongly typed content in services etc.
In order to inject the IPublishedContentQuery
into your services, you must add a using statement for Umbraco.Cms.Core
and inject the service using the constructor.
using Umbraco.Cms.Core;
namespace Umbraco.Docs.Samples.Web.Services;
public class SearchService
{
private readonly IPublishedContentQuery _publishedContentQuery;
public SearchService(IPublishedContentQuery publishedContentQuery)
{
_publishedContentQuery = publishedContentQuery;
}
}
Now you can access the IPublishedContentQuery
through _publishedContentQuery
By default, IPublishedContentQuery
will search on Umbraco's 'External' search index for any published content matching the provided search term.
public IEnumerable<PublishedSearchResult> Search(string searchTerm)
{
foreach (var result in _publishedContentQuery.Search(searchTerm))
{
yield return result;
}
}
Specifying the number of records 'to skip' and the number of records 'to take' improves performance with many matching search results. This approach is beneficial when there is a requirement to implement paging.
public IEnumerable<PublishedSearchResult> Search(string searchTerm, int skip = 5, int take = 10)
{
foreach (var result in _publishedContentQuery.Search(searchTerm, skip, take, out long totalRecords))
{
yield return result;
}
}
For more complex searching you can construct an Examine QueryExecutor. In the example the search will execute against content of type "blogPost" only. Further information on using Examine
using System;
using System.Collections.Generic;
using Examine;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Infrastructure.Examine;
using Umbraco.Extensions;
namespace Umbraco.Docs.Samples.Web.Services;
public class SearchService
{
private readonly IPublishedContentQuery _publishedContentQuery;
private readonly IExamineManager _examineManager;
public SearchService(IPublishedContentQuery publishedContentQuery, IExamineManager examineManager)
{
_publishedContentQuery = publishedContentQuery;
_examineManager = examineManager;
}
public IEnumerable<PublishedSearchResult> Search(string searchTerm)
{
if (!_examineManager.TryGetIndex(Constants.UmbracoIndexes.ExternalIndexName, out IIndex index))
{
throw new InvalidOperationException($"No index found by name{Constants.UmbracoIndexes.ExternalIndexName}");
}
var query = index.Searcher.CreateQuery(IndexTypes.Content);
var queryExecutor = query.NodeTypeAlias("blogPost").And().ManagedQuery(searchTerm);
foreach (var result in _publishedContentQuery.Search(queryExecutor))
{
yield return result;
}
}
}