Session: Querying: How to Use Search
Use the Search()
extension method to perform a full-text search on a particular field. Search()
accepts a string containing
the desired search terms separated by spaces. These search terms are matched with the terms in the index being queried.
As of v4.2 you can also pass an array of the search terms.
An index's terms are derived from the values of the documents' fields. These values were each converted into one or more terms depending on which Lucene analyzer the index used.
Syntax
IRavenQueryable<T> Search<T>(
Expression<Func<T, object>> fieldSelector,
string searchTerms,
decimal boost = 1,
SearchOptions options = SearchOptions.Guess,
SearchOperator @operator = SearchOperator.Or)
Parameters | Type | Description |
---|---|---|
fieldSelector | Expression<Func<TResult>> | Points index field that should be used for querying. |
searchTerms | string (or IEnumerable<string> ) |
A string of the desired search terms separated by spaces (i.e. to search for "john" or "jack", pass the string "john jack"). Alternatively, you can pass an array (or other IEnumerable ) of search terms. Wildcards can be used: ? for any single character, * for any substring. |
boost | decimal | Boost value. Default: 1 . |
options | SearchOptions | Set the operator between this Search method and the preceding extension method in the query. Can be set to one of the following: Or , And , Not , Guess . Default: SearchOptions.Guess . |
@operator | SearchOperator | The operator between the individual terms. Can be set to Or or And . Default: SearchOperation.Or . |
Example I - Dynamic Query
List<User> users = session
.Query<User>()
.Search(u => u.Name, "a*")
.ToList();
List<User> users = await asyncSession
.Query<User>()
.Search(u => u.Name, "a*")
.ToListAsync();
from Users
where search(Name, 'a*')
Example II - Query Using Static Index
List<User> users = session
.Query<User, Users_ByNameAndHobbies>()
.Search(x => x.Name, "Steve")
.Search(x => x.Hobbies, "sport")
.ToList();
List<User> users = await asyncSession
.Query<User, Users_ByNameAndHobbies>()
.Search(x => x.Name, "Steve")
.Search(x => x.Hobbies, "sport")
.ToListAsync();
from index 'Users/ByNameAndHobbies'
where search(Name, 'Steve') or search(Hobbies, 'sport')
Example III - Boosting Usage
List<User> users = session
.Query<User>("Users/ByHobbies")
.Search(x => x.Hobbies, "I love sport", boost: 10)
.Search(x => x.Hobbies, "but also like reading books", boost: 5)
.ToList();
List<User> users = await asyncSession
.Query<User>("Users/ByHobbies")
.Search(x => x.Hobbies, "I love sport", boost: 10)
.Search(x => x.Hobbies, "but also like reading books", boost: 5)
.ToListAsync();
from index 'Users/ByHobbies'
where boost(search(Hobbies, 'I love sport'), 10) or boost(search(Hobbies, 'but also like reading books'), 5)
Note
To leverage the searching capabilities with the usage of static indexes, please remember to enable full-text search in field settings of the index definition.