我正在尝试为Elasticsearch查询获得最佳性能 我需要类似于MySQL查询的东西:
SELECT * FROM table WHERE field_a IN ('value1', 'value2') AND field_b = value
field_a
的值可以介于1之间,假设为20。
所有字段都需要完全匹配。
现在我正在使用查询:
{
"query" : {
"constant_score" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"field_a" : "value1"}},
{ "term" : {"field_a" : "value2"}}
],
"must" : {
"term" : {"field_b" : "value"}
}
}
}
}
}
}
此时索引大约有3000万个文档,此查询以0.04s - 0.06s(通过cURL)返回结果。
有没有更好的方法来获得我需要的结果?
更新
field_a是未分析的字符串
field_b是一个整数。
答案 0 :(得分:2)
如果您想要field_a
进行比较的值列表,可以使用以下查询:
{
"query" : {
"constant_score" : {
"filter" : {
"bool" : {
"should" : [
{ "terms" : {"field_a" : ["value1", "value2", "etc..."]}}
],
"must" : {
"term" : {"field_b" : "value"}
}
}
}
}
}
}
答案 1 :(得分:1)
必须为field_a和field_b创建索引。不要在查询中使用* - 它会降低性能。相反* - 写下你需要的字段。