Elasticsearch第一个查询很慢,其余的都很快

时间:2016-09-21 07:38:02

标签: elasticsearch

我正在使用这种映射(嗯,这是一个更短的版本,以便使问题更容易)在子父关系中item是父,user_items是孩子

curl -XPUT 'localhost:9200/myindex?pretty=true' -d '{
  "mappings": {
    "items": {
       "dynamic": "strict",
       "properties" : {
            "title" : { "type": "string" },
            "body" : { "type": "string" },
}},
    "user_items": {
      "dynamic": "strict",
      "_parent": {"type": "items" },
      "properties" : {
            "user_id" : { "type": "integer" },
            "source_id" : { "type": "integer" },
}}}}'

我经常提出的查询类型:

curl -XGET 'localhost:9200/myindex/items/_search?pretty=true' -d '{
    "query": {
      "bool": {
         "must": [
            {
               "query_string": {
                  "fields": ["title", "body"],
                  "query": "mercado"
               }
            },
            {
               "has_child": {
                  "type": "user_items",
                  "query": {
                     "term": {
                        "user_id": 655
    }}}}]}}}'

在此查询中,必须在给定title上的字段bodymercado上搜索字符user_id,在这种情况下655。< / p>

我读到第一个查询速度太慢的原因是它被缓存,然后其余查询很快,因为它适用于缓存的内容。

我看过我可以使用 eager 更快地完成第一个查询来预加载我的数据(使用"loading" : "eager",对吗?)但是我不知道我该怎么做预紧力。我是否要使用eargertitle上的body,如下所示?

{
  "mappings": {
    "items": {
       "dynamic": "strict",
       "properties" : {
            "title" : { "type": "string" ,
                        "fielddata": {
                            "loading" : "eager"}},
            "body" : { "type": "string",
                        "fielddata": {
                            "loading" : "eager"}},
}},
    "user_items": {
      "dynamic": "strict",
      "_parent": {"type": "items" },
      "properties" : {
            "user_id" : { "type": "integer" },
            "source_id" : { "type": "integer" },
}}}}'

欢迎任何其他建议来推广/缓存第一个查询。提前致谢

PS:我在Linux机器下使用ES 2.3.2,我总共有25.396.369个文档。

2 个答案:

答案 0 :(得分:3)

你可以做三件事。

  1. 使用字段数据预加载 要预加载字段数据,请在映射中使用以下代码段

    &#34; fielddata&#34;:{       &#34;装载&#34; :&#34;渴望&#34;     } 更多详情here

  2. 使用索引加热器 索引加热器是您可以配置的某些查询,它们将在刷新索引时自动运行。 This链接包含有关如何设置取暖器的详细信息。

  3. 使用doc_values Doc值是磁盘上的数据结构,在文档索引时构建,这使得数据访问模式可以进行聚合和排序。 查找更多详情here

答案 1 :(得分:2)

刚刚解决了同样的问题。现场数据预加载是关键。不推荐使用索引升温,默认情况下doc_values处于启用状态。我的应用程序搜索了一个大型索引(100G +)上的几个字段并且速度很慢我不得不重新建立索引,其中loading = eager,我搜索了所有字段。这预加载并导致相当长的启动但在此之后搜索从最初的10s(之后<400ms)变为&lt; 900ms初始搜索(之后<400ms)。进行映射并重新导入数据

Expression<Func<Group, int>> myKeySelector = u => u.UserId;
Expression<Func<Group, bool>> myFilter = u => u.UserId == id;
var results = GetAll(someIndex, someMaxPage, myKeySelector, myFunc );