elasticsearch实例的一些背景知识:
我想返回所有具有特定名称的文档。 属性名称已映射:
"name": {
"type": "string",
"index": "not_analyzed"
}
我尝试过使用不同类型的搜索; filter,query_string,term。都具有相同的结果。当前查询如下所示:
{ "query": {
"query_string": {
"default_field" : "name",
"query": "test_run_435_tc"
}
},
"size" : 10000000
}
问题是查询在第一次尝试时没有返回正确数量的文档。我知道在索引中存在大约45000个文件,名称为“test_run_435_tc”。
但是当第一次运行查询时,它会返回大约5000个文档。 如果我在彼此之后直接重复查询,则返回的文档数量会增加。运行大约3-4个查询后,我在结果中获得了适当数量的文档。
我使用elasticsearch-py作为客户端。
似乎弹性搜索正在变暖,经过几次相同的查询后,弹性返回正确数量的文档..
为什么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”,实际上在第一次尝试时给出了正确的点击次数!
答案 0 :(得分:0)
有一点可以从输出中确定您的查询已超时。这可能是由各种原因造成的。我没有使用python客户端,你需要检查你的客户端是否在进行连接等时设置任何全局超时。
首先还要检查原始查询占用的时间(删除search_type参数)保留超时参数。
由于@moliware建议将您的查询转换为术语查询以获得更好的性能并再次检查时间。
这两项活动可让您了解查询时间。
您还需要了解您是否只需要计算或需要文档的要求。 Search_type计数相对较快,如果您只对count感兴趣,则应该使用它。
我希望您不会找到一个需要100000个文档的用例。即使您想要显示,也需要进行分页。
最后,根据您的文档大小和硬件大小,我很惊讶您只有一个节点和30gb内存。如果您可以自由使用资源,则应考虑在同一服务器中创建更多节点。将ram限制为小于32gb是一个好主意,能够使用java的压缩指针。但是,当你拥有256GB(巨大的)ram时,你可以启动更多节点并从中获益。
使用多个节点,您可以重试查询并检查结果。