使用ElasticSearch / Nest过滤空字符串

时间:2013-12-04 01:12:01

标签: filter elasticsearch nest

这可能是一个愚蠢的问题,但如何使用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"
            }
        }
    }
}

任何指针都会非常感激。

2 个答案:

答案 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())
            )
        )
    )
);