当field是一个对象时,elasticsearch不会返回所有匹配

时间:2016-03-06 05:05:14

标签: javascript elasticsearch

我对Elasticsearch提供的结果感到困惑

我使用简单的查询进行测试,

body: {
   size: 100,
   from: 0,
   query: { match_all: {} },
   fields: ["object"]    <--- this is an object

}

非常直接

我得到了点击率。 hits.total = 141380

但是hits.hits.length = 49

如果我将size增加到1000,我会hits.hits.length = 129

虽然hits.total仍为hits.total = 141380

如果我不使用fields,我会以可读的格式获取所有文档,但如果我指定字段,我会得到一个关键数组对象数组的数组(是搜索结果的复杂格式) !)

有人可以解释为什么使用字段时会有所不同吗?我希望对象只包含我要求的字段。

1 个答案:

答案 0 :(得分:5)

您需要使用Source filtering来获取_source,只返回请求的字段。

只需将fields中的_source替换为body: { size: 100, from: 0, query: { match_all: {} }, _source: ["object"] <--- this is an object }

fields

以下是使用字段选项时结果(匹配计数)不同的原因:

fields参数是关于显式标记为存储在映射中的字段,默认情况下是关闭的,通常不建议使用。 为了向后兼容,如果store参数指定了未存储的字段(_source映射设置为false),它将加载object并从中提取它。

同样只能通过字段选项返回叶字段。因此无法返回对象字段,此类请求将失败。

但是,如果您使用fields选项中的object字段搜索多个索引,并且该字段不存在或映射到string以外的其他数据类型(如{{ 1}}或long)在所有或部分索引中,这些请求不会失败,并将在命中数组中返回。

这就是为什么您为hits.totalhits.hits.length

获取不同值的原因

典型此类查询的输出如下所示:

{
  "took": 91,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 9,
    "failed": 1,
    "failures": [
      {
        "shard": 1,
        "index": "test_index1",
        "node": "GQN77mbqTSmmmwQlmjSBEg",
        "reason": {
          "type": "illegal_argument_exception",
          "reason": "field [object] isn't a leaf field"
        }
      }
    ]
  },
  "hits": {
    "total": 25,
    "max_score": 1,
    "hits": [
      {
        "_index": "test_index2",
        "_type": "test_type1",
        "_id": "1",
        "_score": 1
      },
      {
        "_index": "test_index2",
        "_type": "test_type2",
        "_id": "1",
        "_score": 1
      },
      {
        "_index": "test_index2",
        "_type": "test_type3",
        "_id": "1",
        "_score": 1,
        "fields": {
          "object": [
            "simple text"    <-- here the field 'object' is a leaf field
          ]
        }
      }
    ]
  }
}

此处hits.total是搜索所有索引的所有文档的总数:因为它匹配所有查询。

hits.hits.length是请求未失败的文档编号。