3

我正在使用 AWS ElasticSearch 服务 (1.5.2) 并且每秒接收超过 100 个请求而没有问题。

几乎每个查询都有地理过滤器、全文过滤器、整数过滤器……但我有一个问题,多添加一个简单的过滤器;一个布尔项过滤器。

{
  "from" : 0,
  "size" : 10,
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "and" : {
          "filters" : [ {
            "bool" : {
              "must" : [ {
                "terms" : {
                  "my_boolean_field" : [ false ]
                }
              }, 
              {
                "range" : {
                  "_timestamp" : {
                    "from" : null,
                    "to" : "2016-05-04T15:12:00Z",
                    "include_lower" : true,
                    "include_upper" : false
                  }
                }
              } ]
            }
          }, {
            "geo_distance" : {
              "rounded_location" : [ -8.42, 42.24 ],
              "distance" : "300000m",
              "distance_type" : "plane",
              "optimize_bbox" : "indexed"
            }
          } ]
        }
      }
    }
  },
  "sort" : [ {
    "_geo_distance" : {
      "rounded_location" : [ {
        "lat" : 42.24,
        "lon" : -8.42
      } ],
      "unit" : "m"
    }
  }, {
    "date" : {
      "order" : "desc"
    }
  }, {
    "price" : {
      "order" : "asc"
    }
  } ]
}

添加布尔过滤器后,ElasticSearch 的所有节点中的 CPU 从 10% 增加到 30%,在 10-15 分钟内,平均延迟从 20 毫秒增加到 400 毫秒,一段时间后延迟恢复到正常数字,但 CPU 没有。

该布尔字段已正确映射并且可搜索......有人暗示过这个问题吗?(由于我使用的是官方 Java 库,查询是用“terms”而不是“term”形成的)。

4

1 回答 1

0

最后,我无法解决执行查询的问题,就像我在这里描述的那样......

根据相关字段的 TRUE/FALSE 值,我解决了创建2 种不同文档类型的问题。

使用这种方法,不会增加 CPU,也不会出现延迟问题……而且由于 ElasticSearch 可以一次搜索多种文档类型,因此这种分离不会对我的应用程序代码造成重大问题;)

所以现在,我在两种情况下都执行相同的查询,但只更改文档类型目标:

POST /my_index/doc_type_with_true_value/_search
POST /my_index/doc_type_with_false_value/_search
{
  "from" : 0,
  "size" : 10,
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "and" : {
          "filters" : [ {
            "bool" : {
              "must" : [ {
                "range" : {
                  "_timestamp" : {
                    "from" : null,
                    "to" : "2016-05-04T15:12:00Z",
                    "include_lower" : true,
                    "include_upper" : false
                  }
                }
              } ]
            }
          }, {
            "geo_distance" : {
              "rounded_location" : [ -8.42, 42.24 ],
              "distance" : "300000m",
              "distance_type" : "plane",
              "optimize_bbox" : "indexed"
            }
          } ]
        }
      }
    }
  },
  "sort" : [ {
    "_geo_distance" : {
      "rounded_location" : [ {
        "lat" : 42.24,
        "lon" : -8.42
      } ],
      "unit" : "m"
    }
  }, {
    "date" : {
      "order" : "desc"
    }
  }, {
    "price" : {
      "order" : "asc"
    }
  } ]
}
于 2016-05-28T11:51:36.547 回答