Filter 使用ElasticSearch/Nest筛选空字符串
这可能是一个愚蠢的问题,但如何使用Nest在ElasticSearch中过滤空字符串呢。具体来说,如何重新创建以下结果:Filter 使用ElasticSearch/Nest筛选空字符串,filter,
elasticsearch,nest,Filter,
elasticsearch,Nest,这可能是一个愚蠢的问题,但如何使用Nest在ElasticSearch中过滤空字符串呢。具体来说,如何重新创建以下结果: curl http://localhost:9200/test/event/_search { "filter" : { "term" : { "target" : "" }} } 我试过: (f => f .Term("target", "") ); 根据,它被视为无条件查询并返回所有内容,而添加.Strict()会引发DSL异常: (f =>
curl http://localhost:9200/test/event/_search
{
"filter" : { "term" : { "target" : "" }}
}
我试过:
(f => f
.Term("target", "")
);
根据,它被视为无条件查询并返回所有内容,而添加.Strict()会引发DSL异常:
(f => f
.Strict().Term("target", "")
);
我也尝试过.Missing()和.Exists()但都没有用
my_映射的相关部分供参考:
{
"event": {
"dynamic": "false",
"properties": {
target": {
"type": "string",
"index": "not_analyzed",
"store": true,
"omit_norms": true,
"index_options": "docs"
}
}
}
}
任何指针都将不胜感激。如前所述,如果查询的一部分被证明是无条件的,您可以切换Strict()
模式来触发异常,但如果这是您真正想要的,那么您将被卡住,正如您所发现的那样
我刚刚提交了一个.Verbatim()
构造,其工作原理与.Strict()
完全相同,但它不会抛出异常,而是按原样接受查询并按指定方式呈现
(f => f
.Verbatim()
.Term("target", "")
);
因此,应该禁用无条件查询重写,并按照指定的方式插入查询
(f => f
.Verbatim()
.Term("target", "")
);
这将在下一版本的NEST中实现(因此在当前版本的0.12.0.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())
)
)
)
);
var searchResults=this.Client.Search(s=>s
.Query(q=>q
//.Verbatim()//不,这里不行
.Bool(b=>b
.应该(
bs=>bs.Match(p=>p.Query(“hello”).Field(“name”).Verbatim()),
bs=>bs.Match(p=>p.Query(“world”).Field(“name”).Verbatim())
)
)
)
);
我不知道为什么src总是在Strict=true时抛出DslException,但是您可以直接使用QueryRaw/filterawthanks发送请求“filter”:{“term”:{“target”:“}
,我试图避免这种情况,因为这将需要一个相当大的重构。我希望我错过了一些魔法。我想你可以在NEST上贴一个bug来获得帮助。也许作者可以提出一些更好的替代方案。这不是我设想的用例,但它确实有效。我正在努力添加.Verbatim()
作为.Strict()
的一个计数器部分,如果查询没有条件,它将不会抛出或删除查询,而是按照定义保留查询。我会在github上发布答案。