将twitter数据索引到elasticsearch:已超出索引中总字段数[1000]的限制

时间:2018-01-28 18:41:59

标签: elasticsearch twitter

我有一个将Twitter Stream编入索引到Elasticsearch的系统。它已经运行了几个星期了。

最近出现了一个错误:Limit of total fields [1000] in index [dev_tweets] has been exceeded

我想知道,如果有人遇到过同样的问题吗?

另外如果我运行这个卷曲:

$ curl -s -XGET http://localhost:9200/dev_tweets/_mapping?pretty | grep type | wc -l
     890

它应该给我或多或少的映射中的字段数。这是很多领域,但不超过1000

4 个答案:

答案 0 :(得分:5)

此限制已在以下GitHub issue中引入。

命令计数grep type | wc -l计算文字"类型" 的行数。因此,我猜计数有可能不准确。我做了一个小文本,我获得了比实际字段数更高的值。所以你也可以获得少于实际的字段数,但我还没有想到一个场景。

这是我做过的测试。

curl -s -XGET http://localhost:9200/stackoverflow/_mapping?pretty

{
  "stackoverflow" : {
    "mappings" : {
      "os" : {
        "properties" : {
          "NAME" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "TITLE" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            },
            "fielddata" : true
          },
          "title" : {
            "type" : "text",
            "fielddata" : true
          }
        }
      }
    }
  }
}

由于"类型" 有5行,我输出为5,即使我只有3个字段。

你能否尝试提高限额,看看它是否有效?

PUT my_index/_settings
{
  "index.mapping.total_fields.limit": 2000
}

您还可以在创建索引期间增加此限制。

PUT my_index
{
  "settings": {
    "index.mapping.total_fields.limit": 2000,
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    ...
  }
}

致谢:https://discuss.elastic.co/t/total-fields-limit-setting/53004/2

答案 1 :(得分:1)

在索引中定义太多字段是一种可能导致映射爆炸的情况,这可能会导致内存不足错误和难以恢复的情况。例如,考虑一种情况,其中插入的每个新文档都引入了新字段。这在动态映射中很常见。每当文档包含新字段时,这些字段最终都会出现在索引的映射中。不必担心数据量少,但是随着映射的增长,可能会成为问题。

如果嵌套的字段可以增长并且不受应用程序控制,则尝试将字段映射为app.js。此数据类型对于索引具有大量或未知数量的唯一键的对象很有用。对于整个JSON对象仅创建一个字段映射,这可以帮助防止映射爆炸中包含太多不同的字段映射。

参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/flattened.html

答案 2 :(得分:0)

您可以通过在kibana或邮递员中运行以下命令来更改ES域的设置。只需替换ElasticSearch URL和索引名称,它应该可以正常运行。

PUT /my_index/_settings HTTP/1.1
Host: search-test-prhtf12546bw2qdr6lfr2vq.us-east-1.es.amazonaws.com
Content-Type: application/json

{
    "index": {
        "mapping": {
            "total_fields": {
                "limit": "100000"
            }
        }
    }
}

它将给您以下答复:

{
    "acknowledged": true
}

答案 3 :(得分:0)

studentdoc_setting_index_mapping_type_overlayadjacency.json
{
        "index": {
            "mapping": {
                "total_fields": {
                    "limit": "100000"
                }
            }   
    }
}

@Setting(settingPath = "studentdoc_setting_index_mapping_type_overlayadjacency.json")
public class StudentDoc {
}