我对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
,我会以可读的格式获取所有文档,但如果我指定字段,我会得到一个关键数组对象数组的数组(是搜索结果的复杂格式) !)
有人可以解释为什么使用字段时会有所不同吗?我希望对象只包含我要求的字段。
答案 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.total
和hits.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
是请求未失败的文档编号。