【问题标题】:'Limit of total fields crossed more than 1000 Elasticsearch exception'总字段限制超过 1000 个 Elasticsearch 异常
【发布时间】:2020-05-06 22:43:31
【问题描述】:

由于我的 Sql 架构,我的 Elasticsearch 索引有超过 1000 个字段,我得到以下异常:

{'type': 'illegal_argument_exception', 'reason': '总数限制 索引中的字段 [1000] }

我的批量插入看起来像这样

with open('audit1.txt') as file:
    for line in file:
        columns = line.split(r'||')
        dict['TimeStamp']=columns[0].strip('\'')
        dict['BusinessTimeStamp']=columns[1].strip('\'')
        dict['RuntimeMicroflowID']=columns[2].strip('\'')
        dict['MicroflowID']=columns[3].strip('\'')
        dict['UserId']=columns[4].strip('\'')
        dict['ClientId']=columns[5].strip('\'')
        dict['Userlocation']=columns[6].strip('\'')
        dict['Transactionid']=columns[7].strip('\'')
        dict['Catagorie']=columns[8].strip('\'')
        dict['EventType']=columns[9].strip('\'')
        dict['Operation']=columns[10].strip('\'')
        dict['PrimaryData']=columns[11].strip('\'')
        dict['SecondayData']=columns[12].strip('\'')
        i=13
        while i < len(columns):
            tempdict['BFOLDVALUE'] = columns[i+1].strip('\'')
            tempdict['BFNEWVALUE'] = columns[i+2].strip('\'')
            if columns[i].strip('\'') is not None:
                dict[columns[i].strip('\'')] = tempdict.copy()
            i+=3
            tempdict.clear()
        #print(json.dumps(dict,indent = 4))
        batch.append(dict)
        if counter==BATCHSIZE:
            try:
                helpers.bulk(es, batch, index='audit-index', doc_type='audit')
                insertedrecords+=counter
                counter = 0
                batch.clear()
                print(insertedrecords," - Records Has Been inserted ")
            except BulkIndexError:
                print("Error Occured -- continuing")
                print(json.dumps(dict,indent = 4))
                print(BulkIndexError)
                batch.clear()
                break
        counter+=1
        dict.clear()

所以我假设我试图错误地索引这个,有没有更好的方法在弹性搜索中索引这种格式。请注意,我使用的是 ELK 7.5 版

这是我正在解析到 elasticsearch 的示例文件

2018.07.17/15:41:53.735||2018.07.17/15:41:53.735||'0164a8424fbbp84h%2139165'||'BT_TTB_CashDep_PRC'||'eskedarz'||'UXP'||'00001039'||'0164a842e519pJpA'||'Persistence'||''||'CREATE'||'DailyTxns'||'0164a842e4eapJnu'||'CurrentThread'||'WebContainer : 15'||''||'ParentThread'||'system'||''||'TCPWorkerThreadID'||'WebContainer : 15'||''||'f_POSTINGDT'||'2018-07-17'||''||'versionNum'||'0'||''||'f_TXNAMTDR'||'0'||''||'f_ACCOUNTID'||'013XXXXXXXXX0'||''||'f_VALUEDTTM'||'2018-07-17 15:41:53.0'||''||'f_POSTINGDTTM'||'2018-07-17 15:41:53.692'||''||'f_TXNCLBAL'||'25551.610000'||''||'f_TXNREF'||'0000103917071815410685326'||''||'f_PIEVENTTYPE'||'N'||''||'f_TXNAMT'||'5000.00'||''||'f_TRANSACTIONID'||'0164a842e4e9pJng'||''||'f_TYPE'||'N'||''||'f_USERID'||'xxxarz'||''||'f_SRNO'||'1'||''||'f_TXNBASEEQ'||'5000.00'||''||'f_TXNSRCBRANCH'||'0000X039'||''||'f_TXNCODE'||'T08'||''||'f_CHANNELID'||'BranchTeller'||''||'f_TXNAMTCR'||'5000.00'||''||'f_TXNNARRATION'||'SELF                                                                                      '||''||'f_ISACCRUALPENDING'||'false'||''||'f_TXNDTTM'||'2018-07-17 15:41:53.689'||''

【问题讨论】:

  • 您能分享您尝试索引的文档吗?您的batch 列表中的一项。乍一看,您似乎没有那么多字段可以达到字段限制。键列表2中有多少个不同的iten?
  • 因为它是应用程序的审计日志,它可能会传递一个 1000 字段,但其中 95% 的字段是用 KEY|oldvalue|newvalue 重复列
  • @SerakShiferaw 您是否有时间查看答案,如果您有其他问题,请告诉我,如果有帮助,请投票并接受答案:)
  • @OpsterElasticsearchNinja 我没有得到我正在寻找的答案可能是弹性搜索对文档存储不太好。 mongodb 可以很好地满足我的要求,但我必须索引每一列,这很愚蠢。我什至尝试过嵌套但同样的错误。可能我应该坚持使用列存储关系数据库。所以我可以垂直而不是水平存储KV(行而不是列)。
  • @SerakShiferaw,但最初您的问题是关于 Limit of total fields 的错误,应该通过答案中给出的步骤解决。关于您的评论,是的,在您的情况下,您有很多在搜索和分析用例中不正常的字段,我猜像 columnstore DB 这样的 cassandara 会更适合这个用例

标签: elasticsearch elastic-stack


【解决方案1】:

如果您仔细查看错误消息的这一部分,就会清楚。

索引中总字段 [1000] 的限制

1000 是 Elasticsearch 索引中总字段的默认限制,如其源代码所示。

public static final Setting<Long> INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING =
        Setting.longSetting("index.mapping.total_fields.limit", 1000L, 0, Property.Dynamic, Property.IndexScope);

请注意,这是一个动态设置,因此可以通过更新索引设置在给定索引上进行更改

PUT test_index/_settings
{
  "index.mapping.total_fields.limit": 1500. --> changed it to what is suitable for your index.
}

关于这个问题的更多信息可以在herehere找到。

【讨论】:

  • 如果我将它设置为 500,000 会有问题吗?因为我认为 1500 还不够,所以它失败了 'status': 400, 'error': {'type': 'illegal_argument_exception', 'reason': 'Limit of total fields [1500] in index [audit-index] has been exceeded'}
  • @SerakShiferaw 是的,这是一个巨大的数字,会导致严重的意外问题,请参阅我对这个问题的评论,我想你最好问一个更详细的单独设计问题,这是特定于 ES 错误和让我们专注于此,使其对社区有用?
  • @SerakShiferaw,我还修改了问题的标题和上下文,以便人们在搜索您面临的异常时可以看到这篇文章。
  • 它更像是一个设计问题.. 我需要将这些键值嵌套在某个深处并更新深度限制可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
  • 2019-01-02
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多