我有一个50K文档的测试索引。 我正在针对它发出500(相同)查询,其中有一个字段(一个值数组)“必须”不是“某个值”。 在这500个查询中,有几个失败/超时。 (有时它是5,有时它是9,有时它是18个查询...)有没有办法让“必须”查询更快?在生产中,索引将是几百万个文档,并且大多数查询将具有“必须”条款。
映射如下:
{
"jobs_en":{
"mappings":{
"index":{
"_all":{
"enabled":false
},
"properties":{
"GUID":{
"type":"string",
"index":"not_analyzed"
},
"channel":{
"type":"string",
"index":"not_analyzed"
},
"country":{
"type":"string",
"analyzer":"standard"
}
}
}
}
}
}
查询如下:
{
"bool" : {
"must" : [ {
"bool" : {
"must" : {
"bool" : { }
},
"must_not" : {
"term" : {
"channel" : "Email"
}
}
}
}, {
"bool" : {
"must" : {
"match" : {
"country" : {
"query" : "US",
"type" : "boolean"
}
}
}
}
} ]
}
}"
答案 0 :(得分:0)
我们在ES中拥有一个大型数据库,我认为它没有您的数据库那么大。有几件事对我有帮助:
1.如果可以,请使用Must。
2.不得与Must一起使用。
3.如果您能够:使用Source。
const talkedRecently = new Set();
const seconds = "60";
loopnum = 0
while (loopnum <= seconds)) {
loopnum = loopnum + 1;
if (talkedRecently.has(msg.author.id + "-" + loopnum)) {
msg.channel.send("Wait **" + loopnum + " **seconds before getting typing this again. - " + msg.author);
return;
}
}
loopnum = seconds;
while (loopnum = 0) {
setTimeout(() => {
if (talkedRecently.has(msg.author.id + "-" + (loopnum+1))) {
talkedRecently.delete(msg.author.id "-" + (loopnum+1));
}
talkedRecently.add(msg.author.id + "-" + loopnum);
}, 1000);
loopnum = loopnum - 1;
}
if (talkedRecently.has(msg.author.id + "-1")) {
talkedRecently.delete(msg.author.id "-1");
}
return;
通过先指定必须项,可以加快查询速度。通过指定must_not,可以减少返回记录的数量,这可以是真正的成功。最后,减少这些记录上返回的内容确实很有帮助。
由于没有其他答案,所以我想我会帮助我所知道的。信不信由你,此查询必填项在几十秒之内不会优于仅需查询的相同查询。告诉某事什么是必不可少的,然后过滤掉那不是什么。