Elasticsearch 1st查询很慢,即使我使用" loading:eager"

时间:2016-10-19 10:50:56

标签: elasticsearch

我在itemparent的儿童与父母关系中使用这种映射(嗯,它是一个缩短版本以使问题更容易) user_itemschildren

    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>

这些查询中的第一个是veeeeeeeeeeeeeeeery慢,最多可能需要15秒。以下是非常快(<0.5秒)

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

我读过我可以使用"loading" : "eager"来提升第一个查询。所以我在一个名为myindex_new

的新索引上创建了一个新的映射
    {
      "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" },
    }}}}'

...并按如下方式重新编制索引:

curl -XPOST 'localhost:9200/_reindex' -d '{
    "source" : {
        "index" : "myindex"
    },
    "dest" : {
        "index" : "myindex_new"
    }
}'

问题是我没有得到任何更好的结果。如果我使用eager查询新索引,第一个查询仍然很慢。我也尝试在子字段上添加eager,但它仍然很慢。

我能做出与众不同的事吗?我在重新索引上做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

Fielddata用于对这些特定字段进行排序和聚合。它不会对您的特定查询提供帮助,因为您不会将这些字段用于排序或内部聚合。我尝试了不同类型的急切加载,而不是父母的字段:"loading": "eager_global_ordinals"。更完整的示例here

亲子关系使用全局序数来加速连接。全局序数有两个目的:将associating numerics with string fields和我上面提到的内存使用量减少。

Elasticserch正在父母和孩子之间使用内存中的连接来使关系起作用。对于这些连接,使用全局序数。它们需要构建和预加载。使用"loading": "eager_global_ordinals"它应该预先加载全局序数并使搜索更快,因为这些连接已经预先加载到内存中。