【问题标题】:How to append on existing field with elasticsearch python?如何使用 elasticsearch python 在现有字段上附加?
【发布时间】:2018-12-16 20:08:52
【问题描述】:

我正在使用 kibana 和 Elasticsearch 5.1.1 版和 python 3.6 版。

我已经这样创建了我的索引 put_books

添加用户的功能就是这个

def add_user(first_name, last_name, age, mail):
    doc = {"first_name": "" + first_name, "last_name": "" + last_name, "age": age, "email": "" + mail}
    global id_user
    res = es.index(index="books", doc_type="user", id=id_user, body=doc)
    id_user += 1
    print(res['result']) 

并添加首选项:

def add_preferences(preferences, i):
    doc = es.get(index="books", doc_type="user", id=id_book)
    res = es.update(index="books", doc_type="user", id=i, body={'doc':{"keyword_preferences": preferences}})

我的问题在这里:当我想添加首选项时,它会成功,但如果我想再次添加首选项,它会替换它

id_user = 1
nom = "nom_1"
prenom = "prenom_1"
age = 45
email = "adresse_mail_1"
add_user(prenom, nom, age, email)
add_preferences("comique", 1)
add_preferences("horreur", 1)
get_user(1)

结果是:

updated
{'first_name': 'prenom_1', 'last_name': 'nom_1', 'age': 45, 'email': 'adresse_mail_1', 'keyword_preferences': 'horreur'}

最后,解决方案是:

POST /books/user/1/_update
{
  "script" : {
    "inline": "ctx._source.keyword_preferences += params.preference",
    "lang": "painless",
    "params" : {
        "preference" : ["comique"]
    }
  }
}

【问题讨论】:

  • 您的预期结果是什么?
  • 我的预期结果是:更新{'first_name': 'prenom_1', 'last_name': 'nom_1', 'age': 45, 'email': 'addresse_mail_1', 'keyword_preferences': { '喜剧','恐怖'}}
  • 你不能像上面那样保存keyword_preferences。您可以将数据保存在字典列表中,例如{ 'keyword_preferences': [{"preferences": "comique"},{"preferences": "horreur"}]}。更多信息请关注link
  • 我试过 res = es.update(index="books", doc_type="user", id=i, body={'doc': {'keyword_preferences': [{"preferences" :首选项}]}}),但我现在有: TransportError(400, 'mapper_parsing_exception', 'failed to parse [keyword_preferences]' 当我修改映射时它不会改变
  • 首先,您需要为keyword_preferrences 创建映射。然后索引到它。

标签: python-3.x append field elasticsearch-5 kibana-5


【解决方案1】:

新功能是:

def add_preferences(preferences, i):
   doc = es.get(index="books", doc_type="user", id=i)
   res = es.update(index="books", doc_type="user", id=i, body={'doc': {'keyword_preferences': [{"preferences": preferences}]}})

映射完成,现在我得到了结果:

{'first_name': 'prenom_1', 'last_name': 'nom_1', 'age': 45, 'email': 'mail_1', 'keyword_preferences': [{'preferences': 'horreur'}]}

因此,它已将第一首选项“comique”替换为“horreur”

【讨论】:

    【解决方案2】:

    已编辑。您的问题的示例答案。

    索引文档

    POST /books/user/1
    {
       "keyword_preferences": ["comique"]
    }
    

    现在,更新一个文档以在 keyword_preferences 键中附加 horreur。

    POST /books/user/1/_update
    {
        "script": "ctx._source.keyword_preferences += keyword_preferences",
        "params": {
            "keyword_preferences": ["horreur"]
        },
        "lang": "groovy"
    }
    

    这会将keyword_preferences 更新为["comique", "horreur"]。

    如果更新 API 抛出异常{"type":"script_exception","reason":"scripts of type [inline], operation [update] and lang [groovy] are disabled"},则需要配置 elasticsearch.yml。在 elasticsearch.yml 中添加 script.engine.groovy.inline.update: on script.groovy.sandbox.enabled: true 并重新启动 elasticsearch。我希望这会有所帮助。

    【讨论】:

    • 它有效,但仍将第一首选项“comique”替换为“horreur”
    • 你有想法不替换就追加吗?
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多