我正在尝试在 NEST 中创建一个查询,如下所示:
获取 * 其中 CityName!='' 和 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())));
最佳答案
默认情况下,NEST 使用称为无条件查询的功能来重写查询,而无需编写大量 if 语句来构建查询/过滤器。参见 http://nest.azurewebsites.net/nest/writing-queries.html
如果你想关闭它,你可以在图表中的任何时候调用 .Verbatim(bool verbatim = true)
这个标志被传递给 child ,并将导致他们被写入结果查询/过滤器,即使它们是无条件的。
类似地设置 .Strict(bool strict = true)
将在查询是无条件但绝不允许的情况下抛出异常。
关于elasticsearch - 嵌套 Elasticsearch 中的空字段过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155371/