我的整个索引大约是700M文档,这个查询:
{
"query": {
"term": {
"SOME_FIELD": "SOME_TERM"
}
},
"size": 10
}
适用于ca 5M docs。 " Some_field"被索引,未分析。 查询平均需要大约1s hetzner。太慢:)我不关心分页或排序或得分。我只想先10"随机"匹配文档。
有没有办法用残疾分数,用#34; mysql方式"?
filter或constant_score没有帮助
答案 0 :(得分:0)
如果你使用过滤器,那将删除分数计算并提供更快的查询速度:
{
"query": {
"bool": {
"filter": {
"term": {
"SOME_FIELD": "SOME_TERM"
}
}
}
}
"size": 10
}
如果这仍然太慢,您可以考虑使用document routing,但它可能不适合您,因为SOME_FIELD
可能只有1个分片或很少的术语。
我还建议您阅读Elastic的production deployment文档,它概述了如何以最佳方式配置群集,并且在您当前拥有错误配置的群集(即运行)时也可以产生一些严重的性能提升在一台强大的机器上,但保持默认的ES_HEAP_SIZE
值。
答案 1 :(得分:0)
我正在寻找的选项是" terminate_after"。不幸的是,它不是很好"记录,见:
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-limit-query.html
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-count.html#_request_parameters
所以,我的查询如下:
{
"query": {
"term": {
"SOME_FIELD": "SOME_TERM"
}
},
"size": 10,
"terminate_after": 10
}
不要使用" 10"而不是10.弹性不会将其强制转换为整数并忽略参数