This content is archived. See latest version here.

Last updated: Feb 23 2015

The .NET API provides rich functionality both for free text search and for querying by applying filters. These can also be combined so that certain criteria are applied to free text search by means of filters. Sometimes however the opposite is desired. That is, instead of limiting search results by applying filter we may want to include documents that does not necessarily match the search query or previously applied filters.

This can be achieved using the Include method. Just like the Filter method and the Boostmatching method, the Include method requires a filter expression as a parameter. Documents that match this filter will be included in the result even if they otherwise would not have been. As these documents may not match any previously applied search query they will be given a constant score. This means that they will be ordered high or low in the search results depending on the score of other documents in the result. Therefor the Include method has a second parameter by which we can enter a boost factor. Set it to 1 if you do not care about the ordering, to for instance 10 if you want the documents high in the search results and 0.1 if you want them low in the search results.

Examples

A typical use case for using the Include method is when building search as you type functionality. We may then want to perform a regular free text search AND include documents whose title contains a word that starts with what the user has entered. For instance, if we are building search as you type functionality for blog posts and the user has entered Bar into the search text box. It may be that the user is searching for bar, or it may be that the user is about to type in Barcelona. In order to retrieve sensible suggestions for the user wed like to both perform a regular free text search but also include blog posts where the title (or other important but short fields) contains a word that starts with bar.

C#
var q = "Bar";

searchResult = client.Search<BlogPost>()
  .For(q)
  .Include(x => x.Title.AnyWordBeginsWith(q), 1)
  .GetResult();

Note that we are using the AnyWordBeginsWith filter method in the above example. This is a powerfull method that should be used with caution. It is perfectly sensible to use it on short fields such as titles, tags and the like, but not on longer text fields as that will have a sever, negative, effect on performance.

Comments