巢弹性搜索中的空场过滤器

时间:2015-07-01 07:43:14

标签: elasticsearch filter nest

我正在尝试在NEST中创建一个类似的查询:

get * where 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())));

1 个答案:

答案 0 :(得分:0)

默认情况下,NEST使用称为无条件查询的功能来重写查询,而无需编写大量if语句来构建查询/过滤器。见http://nest.azurewebsites.net/nest/writing-queries.html

如果你想关闭它,你可以在图形调用.Verbatim(bool verbatim = true)中的任何一点将这个标志转移给子节点,并使它们被写入生成的查询/过滤器,即使它们是无条件的。

类似地,当查询无条件但永远不允许时,设置.Strict(bool strict = true)将抛出异常。