elasticsearch,nest,Filter,elasticsearch,Nest" /> elasticsearch,nest,Filter,elasticsearch,Nest" />

Filter 使用ElasticSearch/Nest筛选空字符串

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 =>

这可能是一个愚蠢的问题,但如何使用Nest在ElasticSearch中过滤空字符串呢。具体来说,如何重新创建以下结果:

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上发布答案。