有没有一种方法可以在Elasticsearch查询中排除一个字段?

38

我知道使用字段设置可以在搜索中只包含我想要的字段 http://www.elasticsearch.org/guide/reference/api/search/fields/

...但我想知道是否可以做相反的操作,即指定不想在查询结果中包含的一个或两个字段(例如附件)。当我可以指定要排除的字段时,手动输入所有想要的字段减少一个或两个字段会很麻烦。


2
只是为了明确起见,你链接的“fields”参数不会影响查询运行的字段,而只会影响返回的内容...(我想你知道这一点,更多是为了其他人阅读。) - ramseykhalaf
是的,我知道,不过还是谢谢你澄清。 - concept47
这个回答解决了你的问题吗?如何让elasticsearch只返回特定的字段? - Aaron_ab
2个回答

42

请问您能解释一下这行代码中的通配符选择器 "exclude": [ "*.description" ]" 吗? *.description 和正则表达式中的 .*\.description 是相同的吗?谢谢! - crollywood
嗨@crollywood,这个例子来自ES官方文档,它排除了所有的“description”子字段,所以我认为你的正则表达式是正确的。 - Roberto
现在在 _source 对象中,includeexclude 已经被弃用,分别被 includesexcludes 替代。 - gaborsch
1
我的理解是,_source 只影响结果中返回哪些字段,而不影响实际搜索哪些字段。 - David Medinets

7

你是否在你提出问题的同一页上看到了 ‛partial‛ 的文档?这可以让你做你想要的事情,尽管我相信只能在 ‛_source‛ 字段上使用。请参见https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-fields.html

_source 中加载数据时,可以使用 partial 字段来使用通配符控制将基于 includeexclude 模式加载 _source 的哪个部分。

包括和排除都支持多个模式:

{
    "query" : {
        "match_all" : {}
    },
    "partial_fields" : {
        "partial1" : {
            "include" : ["obj1.obj2.*", "obj1.obj4.*"],
            "exclude" : "obj1.obj3.*"
        }
    }
}

1
你至少可以引用一下那份文档。即使提问者错过了一些显而易见的东西,这也更像是一条评论而不是答案。 - Paul Bellora
1
@PaulBellora - 好的,我当时是在移动设备上发布的,所以向concept47道歉。 - James Addison
@concept47,你是否考虑过在Google Groups帖子中执行“排除”操作,同时为“*”执行“包含”操作?不确定是否可能,但也许可以尝试一下?(我承认这有些牵强) - James Addison
1
问题在于所有字段都被返回了,所以我认为这不会影响它,但我也会尝试一下。 - concept47
我很困惑,我刚试验了发布的答案,包括和不包括“include”部分都可以正常运行。如果您仍需要帮助,请发一个 Gist。 - ramseykhalaf
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接