Loading...
Area: Episerver Find
Applies to versions: 12 and higher
Other versions:

Filter and FilterHits

Use filters to narrow down search results, or use them for database-like queries. This topic explains how to filter search results based on Filter and FilterHits, with the Filter method in Episerver Find. 

How it works

There are two extension methods for the ITypeSearch<TSource> class filter: Filter and FilterHits. Both add filters to a search request but do so in different ways.

The Filter method applies a filter to the search query, while FilterHits adds a filter to the search request body. Filters added using the Filter method apply both to search results and to returned facets. Filters added using the FilterHits method filter only search results, not facets.

Use the Filter method in most cases for performance reasons, and always when not using facets. Use FilterHits when you want to apply a filter to search results (the hits), but not to the facets.

Example

You index three blog posts. Two have the same author.

var post1 = new BlogPost
    {
        Author = new Author {Name = "Agatha Christie"}
    };

var post2 = new BlogPost
    {
        Author = new Author {Name = "Agatha Christie"}
    };

var post3 = new BlogPost
    {
        Author = new Author {Name = "Charles Dickens"}
    };

Next, search for blog posts, filter by author to match the one with two posts, and request a terms facet for the author name. First, use the Filter method; then, the FilterHits method.

var result = client.Search<BlogPost>()
    .Filter(x => x.Author.Name.Match("Agatha Christie"))
    .TermsFacetFor(x => x.Author.Name)
    .GetResult();

var facetItems = result.TermsFacetFor(x => x.Author.Name);
Console.WriteLine("Using Filter");
foreach (var facetItem in facetItems)
{
    Console.WriteLine(facetItem.Term + " (" + facetItem.Count + ")");
}

result = client.Search<BlogPost>()
    .FilterHits(x => x.Author.Name.Match("Agatha Christie"))
    .TermsFacetFor(x => x.Author.Name)
    .GetResult();

facetItems = result.TermsFacetFor(x => x.Author.Name);
Console.WriteLine("Using FilterHits");
foreach (var facetItem in facetItems)
{
    Console.WriteLine(facetItem.Term + " (" + facetItem.Count + ")");
}

This code produces:

Using Filter
Agatha Christie (2)

Using FilterHits
Agatha Christie (2)
Charles Dickens (1)

Last updated: Oct 31, 2016

Feedback?