var result = client.Search<Package>(x => x.Query(q => q.Object(new Package{...etc ...})));
Can never work because Nest cannot infer what type of query to use for each property on your object, (i.e term, prefix, wildcard, query_string, etc etc etc).
In your example q=retail
only works because elasticsearch
will break the query up into q OR retail
. You can target fields using regular lucene syntax i.e targetBusiness.industry:retail
.
In elasticsearch if your querystring is not bound to a field it will by default search in the _all
field which will have all the terms for all the properties of an object. Which is why if you really have a lot of data turning off _all
support is usually a really good idea.
Nest doesn't currently have such a functionality where it can take a partially filled object and translate it into an elasticsearch query_string
query.
Say if this is your query:
client.Search<Package>(s=>s
.From(0)
.Size(10)
.Filter(f=>
f.Term(p=>p.TargetBusiness.Industry, "Advertising")
&& f.Exists(p=>p.Name)
)
.Query(q=>
q.QueryString(qs=>qs
.Query("ecommerce")
.Operator(Operator.and)
)
)
)
In the above example you'll have to create your own method that gives all the terms to search for in the query string query based on your package.
i.e
public string MyPackageQueryString(Package package)
{
var myTerms = List<string>();
myTerms.Add(package.Name);
if (package.TargetBusiness != null)
{
myTerms.Add(package.Industry)
....
}
...
return string.Join(" ", myTerms.Where(t=>!string.IsNullOrWhiteSpace(t)));
}
and then
client.Search<Package>(s=>s
.From(0)
.Size(10)
.Filter(f=>
f.Term(p=>p.TargetBusiness.Industry, "Advertising")
&& f.Exists(p=>p.Name)
)
.Query(q=>
q.QueryString(qs=>qs
.Query(this.MyPackageQueryString(package))
.Operator(Operator.or)
)
)
)