问题 有没有办法在Elasticsearch查询中排除字段


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

...但是我想知道我是否可以做相反的事情......不知怎的,指定一个或两个我不希望包含在查询结果中的字段(例如附件)。当我可以指定要排除的字段时,必须输入我想要的所有字段减去一两个,这似乎很痛苦


2165
2017-08-13 23:23


起源

为了清楚起见,您链接到的“fields”参数不会影响查询运行的字段,只会返回返回的内容...(我想您知道这一点,更多其他人阅读。) - ramseykhalaf
是的,我知道,谢谢你的澄清。 - concept47


答案:


您可以使用源过滤(在1.6和1.7中测试过): https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html 

{
    "_source": {
        "include": [ "obj1.*", "obj2.*" ],
        "exclude": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

您也可以在GET请求中使用它:

curl "localhost:9200/myindex/mytype/66a8f299870b4cab?_source_exclude=file._content&pretty"

前面的示例排除了附件字段中的文件内容。


8
2017-08-31 22:16



你能解释一下这行中的通配符选择器: "exclude": [ "*.description" ]?是 *.description 与(在正则表达式中重写)相同: .*\.description?谢谢! - crollywood
嗨@crollywood,这个例子取自ES官方文档,它排除了所有“描述”子字段,所以我认为你的正则表达式是正确的。 - Roberto


您是否在问题中链接的同一页面上看到了“部分”的文档?这可以让你做你想做的事,虽然只是在我认为的'_source'字段。看到 http://www.elasticsearch.org/guide/reference/api/search/fields/

从中加载数据时 _sourcepartial 字段可以用来使用   通配符来控制哪个部分 _source 将基于加载    include 和 exclude 图案。

include 和 exclude 支持多种模式:

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

7
2017-08-14 05:09



那么你至少可以引用那些文档。即使OP错过了一些明显的东西,这更多的是评论而不是答案。 - Paul Bellora
是的,我看到了,试过但它没有用,所以我可能做错了什么,只是不知道是什么: - concept47
你能发帖试试吗? (感到惊讶的是没用!) - ramseykhalaf
groups.google.com/forum/#!topic/elasticsearch/hdtI_FkSabI - concept47
@PaulBellora--足够公平。发布时我在移动设备上,所以对concept47道歉。 - James Addison