我正在尝试在NEST中创建一个查询,如下所示:
get * where CityName!='‘and StreetName!='’
使用现有的和缺少的筛选器没有任何帮助,因为字段不为空。我还尝试使用带有通配符(*)的queryString,但我在结果中返回了所有文档。我还尝试了脚本过滤器,如下所示:
qq.Filtered(ft => ft.Filter(f => f.Script(s => s.Script("doc['cityName'].value.length() > 0"))));也不能工作。字段使用标准标记器和ICU折叠进行索引。有什么解决方案吗?
更新!
我通过使用Regexp过滤器设法做到了这一点。所以它是这样的:
QueryContainer notNullQuery = null;
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdCityName).Value("[a-z0-9]+[\\s]?"))));
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdStreetCode).Value("[0-9]+"))));
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdStreetPostCode).Value("[a-z0-9]+[\\s]?"))));
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.LastName1).Value("[a-z0-9]+[\\s]?"))));
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.FirstName1).Value("[a-z0-9]+[\\s]?"))));
notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.SourceDisplayPhone).Value("[0-9]+"))));
return notNullQuery;稍后的更新:对于NEST 5.x,将字段作为关键字进行索引,然后对术语进行查询搜索。不要忘了使用Verbatim(),否则查询将不会被发送到服务器。
qq.Bool(b => b.MustNot(mn => mn.Term(t => t.Field(f => f.Email).Value("").Verbatim())));发布于 2015-07-02 15:34:37
默认情况下,NEST使用一种称为无条件查询的特性来重写查询,而无需编写大量if语句来构建查询/过滤器。请参阅http://nest.azurewebsites.net/nest/writing-queries.html
如果你想关闭它,你可以在图中的任何地方调用.Verbatim(bool verbatim = true),这个标志会传递给孩子,并会导致他们被写到结果查询/过滤器中,即使他们是无条件的。
类似地,当查询是无条件的,但永远不允许这样做时,设置.Strict(bool strict = true)将抛出异常。
https://stackoverflow.com/questions/31155371
复制相似问题