HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Free text search

Describes how free text search works in Optimizely Search & Navigation, how to perform queries against fields, and how to work with stemming in free text search.

You typically use the For method to search for phrases or keywords in indexed documents. For instance, to search for blog posts that contain car, use the code in the following examples.

var searchResult = client.Search<BlogPost>()
    .For("Car")
    .GetResult();

Typically, a search query is fetched from user input.

var query = Request.QueryString["q"];
var searchResult = client.Search<BlogPost>()
    .For(q)
    .GetResult();

Search fields

By default, a search query using the For method is performed against a field named _all. The field is generated when an object is indexed, and it is made up of all of the document's fields combined.

Search queries should specify fields using the InField, AndInField and InFields methods. These methods expect a lambda expression, which retrieves the field name. For example, this code searches the Title field of blog posts.

var searchResult = client.Search<BlogPost>()
    .For(q)
    .InField(x => x.Title)
    .GetResult();

To also search the Content field, add a second InField method.

var searchResult = client.Search<BlogPost>()
    .For(q)
    .InField(x => x.Title)
    .InField(x => x.Content)
    .GetResult();

Alternatively, you can use the InFields method or the AndInField method. Their usage is demonstrated below.

//Using InFields
var searchResult = client.Search<BlogPost>()
    .For(q)
    .InFields(x => x.Title, x => x.Content)
    .GetResult();

//Using AndInField
var searchResult = client.Search<BlogPost>()
    .For(q)
    .InField(x => x.Title)
    .AndInField(x => x.Content)
    .GetResult();

If one or more fields are specified using the methods described above, the search is no longer performed against the All field. However, you can explicitly request the search to use the InAllField method.

var searchResult = client.Search<BlogPost>()
    .For(q)
    .InField(x => x.Title)
    .InAllField()
    .GetResult();

Stem words

Stemming is the process of reducing a word to its root form. When using stemming in free text search, words with similar meanings, such as car and cars, match.

Stemming is language-dependent, so you need to tell the search engine the language in which you are searching. To do this, pass an instance of the Language class to the Clients Search method. Instances of the Language class that match supported languages are available as static properties on the Language class.

📘

Note

Search with the All field cannot use stemming. This means that, for the language parameter to have any effect, you must specify search fields (such as InField) using methods described above. Below is a sample search request for cars_that matches blog posts titled _car or A blue car.

client.Search<BlogPost>(Language.English)
    .For("cars")
    .InField(x => x.Title)
    .GetResult();

Often, you want to search several known fields with stemming but also match text that is not in those fields. Although the All field does not support stemming, you can still search for it when using stemming. You can use the following code to search the Title and Content fields for blog posts and still match blog posts that do not contain the word cars in their Title or Content fields but do have the word in another field (such as tags).

client.Search<BlogPost>(Language.English)
    .For("cars")
    .InField(x => x.Title)
    .InField(x => x.Content)
    .InAllField()
    .GetResult();

Use AND as operator in multi-word queries

You can configure the free text search to use "AND" as an operator instead of the default "OR" to match search terms minus stop words in multi-word queries. For example, searching for "houses in Stockholm" may return many irrelevant results for "houses."

To avoid this, you can use WithAndAsDefaultOperator() after a method that returns IQueriedSearch<T>, such as For().

SearchClient.Search<AClass>()
.For("houses Stockholm")
.WithAndAsDefaultOperator();

This will only return results matching "houses" and "Stockholm."