Last updated: Nov 16 2015

How it works

The Filter method can be used to filter string fields in a number of ways. Below is a list of use cases and examples illustrating the available methods.

Existence

To search for documents where a string field has a value, we can use the Exists method. The following search finds blog posts that has a title. In other words, the following code is similar to the LINQ query Where(x => x.Title != null).

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.Exists());

Like all filters it can be negated using an exclamation mark (!). In other words, to instead find all blog posts that does not have a title we could use the following code.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => !x.Title.Exists());

Exact match

For exact matching we can use the Match method. The following search will match blog posts titled Find but not those titled find, fInd, Find rocks! or  Hello Find. The LINQ equivalent is Where(x => x.Title == Find).

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.Match("Find"));

Case insensitive match

For exact matching disregarding casing we can use the MatchCaseInsensitive method. The following search matches blog posts titled Find, find and fInd but not those titled Find rocks! or Hello Find. In other words, the following search is similar to the LINQ query Where(x => x.Title.ToLower() == Find.ToLower()).

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.MatchCaseInsensitive("Find"));

Matching by beginning of a string (startsWith)

The Prefix method allows to match by the beginning of a string. The following search matches blog posts titled Find and Find rocks! but not find, Finding or Hello Find.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.Prefix("Find"));

Use the PrefixCaseInsensitive method to instead match by the beginning of a string in a case-insensitive way. The following search matches blog posts titled Find, Find rocks! and Find but not Finding or Hello Find.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.PrefixCaseInsensitive("Find"));

Matching by beginning of any word (wildcard, autocomplete)

In some situations, such as when building autocomplete or search-as-you-type functionality, we want to filter on whether any word in a string starts with a certain string. This can be achieved by using the AnyWordBeginsWith method.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.AnyWordBeginsWith("Ban"));

The above query will match blog posts titled Banana, banana, Banana split or Yellow bananas. It wont however match blog posts titled Abandon because there is no word in that title that starts with ban (although it does contain those characters). While the Match and Prefix methods are case-sensitive and have their case-insensitive counterparts the AnyWordBeginsWith method is not case-sensitive and there is no case-sensitive counterpart to it.

Matching by range

The InRange method lets you filter on string fields that match a specific range. For instance, the following search matched blog posts titled A, Aa, and B but not those titled Bb or C.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.InRange("A", "B"));

Matching by a set of values

The In method allows to filter on string fields that match an explicit list of values. For instance, the following search matches blog entries titled A, B and C.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Title.In(new List<string> { "A", "B", "C" }));

Filtering on string collections

You also can use the Exists, Match, In and MatchCaseInsensitive methods for properties the implement IEnumerable<string>. The following search uses Exists and matches blog posts that has at least one tag.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Tags.Exists());

And the following search matches any blog post that has the tag Find. It will not limit the result to blog posts that only are tagged with Find.

C#
var searchQuery = client.Search<BlogPost>()
    .Filter(x => x.Tags.Match("Find"));

Comments