弹性搜索不能查询速度慢

时间:2017-02-10 18:35:37

标签: performance elasticsearch

我有一个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"
        }
      }
    }
  }
} ]
  }
}"

1 个答案:

答案 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,可以减少返回记录的数量,这可以是真正的成功。最后,减少这些记录上返回的内容确实很有帮助。

由于没有其他答案,所以我想我会帮助我所知道的。信不信由你,此查询必填项在几十秒之内不会优于仅需查询的相同查询。告诉某事什么是必不可少的,然后过滤掉那不是什么。