这可能是一个愚蠢的问题,但如何使用Nest过滤ElasticSearch中的空字符串。具体来说,我如何重新创建以下结果:
curl http://localhost:9200/test/event/_search
{
"filter" : { "term" : { "target" : "" }}
}
我试过了:
(f => f
.Term("target", "")
);
根据ElasticSearch and Nest filtering does not work被视为无条件查询并返回所有内容,而添加.Strict()会抛出DslException:
(f => f
.Strict().Term("target", "")
);
我也试过.Missing()和.Exists()无济于事。
我的_mapping的相关部分供参考:
{
"event": {
"dynamic": "false",
"properties": {
target": {
"type": "string",
"index": "not_analyzed",
"store": true,
"omit_norms": true,
"index_options": "docs"
}
}
}
}
任何指针都会非常感激。
答案 0 :(得分:6)
正如documentation on NEST and writing queries提到的那样,如果您的查询的一部分原来是Strict()
,那么您可以切换conditionless
模式以触发异常,但如果这就是您真正想要的内容那么您就会陷入困境你已经发现了。
我刚刚提交了一个.Verbatim()
构造,其工作方式与.Strict()
完全相同,但它不会抛出异常,而是按原样执行查询并按指定呈现。
(f => f
.Verbatim()
.Term("target", "")
);
因此应禁用conditionless
查询重写并按指定字面插入查询。
这将使其成为NEST的下一个版本(因此在当前版本的0.12.0.0之后)
答案 1 :(得分:0)
我只想说你必须在每个查询中使用Verbatim(),而不是只在顶部使用一次。
var searchResults = this.Client.Search<Project>(s => s
.Query(q => q
//.Verbatim() // no, here won't work
.Bool(b => b
.Should(
bs => bs.Match(p => p.Query("hello").Field("name").Verbatim()),
bs => bs.Match(p => p.Query("world").Field("name").Verbatim())
)
)
)
);