关于elasticsearch实例的一些背景信息:
- 一个节点,一台机器
- 特定索引包含26亿个文档,大小为1.23TB
- 索引分为4个分片。
- 堆大小设置为30 GB
- 服务器有256GB的内存和40个核心。
- Elasticsearch(版本1.4.3)是此服务器上唯一运行的内容
我想返回所有具有特定名称的文档。属性名称已映射:
"name": {
"type": "string",
"index": "not_analyzed"
}
我尝试使用不同类型的搜索方法,包括过滤、查询字符串和术语。但是它们都得到了相同的结果。当前的查询看起来像这样:
{ "query": {
"query_string": {
"default_field" : "name",
"query": "test_run_435_tc"
}
},
"size" : 10000000
}
问题在于第一次查询没有返回正确数量的文档。我确实知道索引中存在大约45000个名称为“test_run_435_tc”的文档。
但是,当第一次运行查询时,它只返回了大约5000个文档。如果我连续重复查询,返回的文档数量将会增加。经过3-4次查询后,结果中返回了正确数量的文档。
我正在使用elasticsearch-py作为客户端。
看起来elasticsearch需要预热,并且在运行几次相同的查询之后,elastic才会返回正确数量的文档。
为什么elasticsearch会表现出这种行为?这是elasticsearch的正常行为还是我遗漏了什么?当然,我希望能在第一次尝试中获得正确的结果。
更新基于评论:
"size":10000000 是因为我不知道索引中有多少相同名称的文档。
将 "size":0 设置为执行查询时,以下是响应:
{u'_shards': {u'failed': 0, u'successful': 4, u'total': 4},
u'hits': {u'hits': [], u'max_score': 0.0, u'total': 28754},
u'timed_out': True,
u'took': 130}
当使用 "size" : 0 再次运行相同的查询时,这是响应:
{u'_shards': {u'failed': 0, u'successful': 4, u'total': 4},
u'hits': {u'hits': [], u'max_score': 0.0, u'total': 39223},
u'timed_out': True,
u'took': 134}
使用与上面相同的查询,但将 "size" 设置为 0,并使用以下参数 ...?timeout=100000&search_type=count 运行,将返回以下响应结果:
{
"took": 525,
"timed_out": false,
"_shards": {
"total": 4,
"successful": 4,
"failed": 0
},
"hits": {
"total": 49501,
"max_score": 0,
"hits": []
}
}
上面的响应返回了49501个“hits_total”,实际上在第一次尝试中已经给出了正确的点击次数!