如果我在 Elasticsearch 中禁用 _source 和 _all,我可以获得一个字段吗

wen*_*ner 2 elasticsearch

Elasticsearch建议在我的情况下禁用_source_all字段,这是我的映射

{
  "template": "mq-body-*",
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0,
    "max_result_window": 100,
    "codec": "best_compression"
  },
  "mappings": {
    "_default_": {
      "_source": {
        "enabled": false
      },
      "_all": {
        "enabled": false
      }
    },
    "body": {
      "properties": {
        "body": {
          "type": "string",
          "doc_values": true,
          "index": "not_analyzed"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

body.body是一个非常大的字段(20k-300k),我们不必索引和稀有获取,这是可能丢失的。但是之后

PUT /mq-body-local/body/1
{"body":"My body"}
Run Code Online (Sandbox Code Playgroud)

我无法通过GET /mq-body-local/body/1?fields=bodyor找到正文POST /mq-body-local/body/_search -d'{"fields":["body"]}',结果找到了一个但没有文档。我知道没有_source我不能做getor 的search,但是我怎样才能检索我的文档呢?

Or *_*ger 5

来自 Elasticsearch 的网站:

_source 字段包含在索引时传递的原始 JSON 文档正文。_source 字段本身没有索引(因此不可搜索),但它被存储以便在执行获取请求(如 get 或 search)时返回它

禁用源将阻止 Elasticsearch 在结果集中显示它。但是,过滤、查询和聚合不会受到影响。

因此,这两个查询不会生成任何实际结果:

GET mq-body-local/body/_search

GET mq-body-local/body/1

但是,您可以运行此聚合,其中将包含一些源,例如:

POST mq-body-local/body/_search

{
  "aggs": {
    "test": {
      "terms": {
        "field": "body"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将产生这个结果集(我已经创建了一些测试记录):

"aggregations": {
    "test": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "my body",
          "doc_count": 1
        },
        {
          "key": "my body2",
          "doc_count": 1
        }
      ]
    }
  }
Run Code Online (Sandbox Code Playgroud)