代码之家  ›  专栏  ›  技术社区  ›  gal007

使用Python DSL Elasticsearch UpdateByQuery单独更新大量文档

  •  0
  • gal007  · 技术社区  · 7 年前

    def update_references(self, query, script_source):
    
        try:
            ubq = UpdateByQuery(using=self.client, index=self.index).update_from_dict(query).script(source=script_source)
            ubq.execute()
    
        except Exception as err:
            return False
    
        return True
    

    一些示例值包括:

    • query={query':{match':{u id':'vpki1msbnudimfsyxm4'}}
    • script\u source='ctx.\u source.refs=[\'python\',\'java\']'

    问题是当我这样做的时候,我得到了一个错误:“太多的动态脚本编译,max:[75/5m];请使用索引或带参数的脚本;此限制可以通过[script.max\u compilations\u rate]设置更改。

    如果我使用Kibana更改最大编译速率,则没有任何效果:

    PUT _cluster/settings
    {
      "transient": {
        "script.max_compilations_rate": "1500/1m"
      }
    }
    

    无论如何,最好使用参数化脚本。我试过:

        try:
            ubq = UpdateByQuery(using=self.client, index=self.index).update_from_dict(query).script(source=script_source, params=script_params)
            ubq.execute()
    
        except Exception as err:
            return False
    
        return True
    

    所以,这次:

    • script\u params={'value':[\'python\',\'java\']}

    但是由于每次都必须更新查询和参数,因此需要为大型集合中的每个文档创建一个UpdateByQuery的新实例,结果是相同的错误。

    我还尝试遍历和更新大型集合:

    es.update(
        index=kwargs["index"],
        doc_type="paper",
        id=paper["_id"],
        body={"doc": {
            "refs": paper["refs"]  # e.g. [\\'python\\', \\'java\\']
        }}
    )
    

    但我得到以下错误:“建立新连接失败:[Errno 99]无法分配请求的地址juil。10 18:07:14围嘴枪[20891]:邮递 http://localhost:9200/papers/paper/OZKI1msBNuDimFsy0SM9/_update

    所以,如果你对如何解决这个问题有任何想法,我们将非常感激。 最好的,

    0 回复  |  直到 7 年前