5

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

curl http://localhost:9200/test/event/_search
{
    "filter" : { "term" : { "target" : "" }}
}

我试过了:

(f => f
    .Term("target", "")
);

根据ElasticSearch 和 Nest 过滤不起作用,它被视为无条件查询并返回所有内容,同时添加 .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"
            }
        }
    }
}

任何指针将不胜感激。

4

2 回答 2

9

正如关于 NEST 和编写查询的文档所提到Strict()的,如果您的查询的一部分结果是,您可以切换模式以触发异常,conditionless但如果那是您真正想要的,那么您就会陷入困境。

我刚刚提交了一个.Verbatim()工作原理完全一样的构造,.Strict()但它不会抛出异常,而是按原样处理查询并按指定呈现它。

(f => f
    .Verbatim()
    .Term("target", "")
);

因此应该禁用conditionless查询重写并按照指定的字面意思插入查询。

这将在 NEST 的下一个版本中实现(因此在当前版本 0.12.0.0 之后)

于 2013-12-11T22:55:02.120 回答
2

我只想说,您必须在每个查询中使用 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())
            )
        )
    )
);
于 2016-11-16T17:58:35.843 回答