Как улучшить эту функцию, чтобы избежать индексации дублирующихся документов на Elasctisearch - PullRequest
0 голосов
/ 05 мая 2020

как мне улучшить свою функцию, чтобы вставить идентификатор моего фрейма данных в «_id» документа Elasticsearch для обработки дубликатов?.

Структура фрейма данных

print(df.info())

#   Column             Non-Null Count  Dtype
---  ------             --------------  -----
 0   id                 412 non-null    object
 1   email_address      412 non-null    object
 2   first_name         412 non-null    object
 3   last_name          412 non-null    object

Функция преобразования в формат, совместимый с elasticsearch

def to_elastic_json(df, index_name):
            import json
            for record in df.to_dict(orient="records"):
                yield ('{ "index" : { "_index" : "%s"}}'% (index_name))
                yield (json.dumps(record, default=str))

es_response = elastic_client.bulk(to_elastic_json(df, INDEX_name))

1 Ответ

1 голос
/ 05 мая 2020

РЕДАКТИРОВАТЬ

Да, ES обновит do c с новым номером _version, если вы загрузите do c с уже существующим _id:

Вот как это сделать:

def to_elastic_json(df, index_name):
    import json
    for record in df.to_dict(orient="records"):
        yield ('{ "index" : { "_index" : "%s", "_id": "%s"}}'% (index_name, str(record['id'])))
        yield (json.dumps(record, default=str))

Подтвердите, позвонив

GET INDEX_NAME/_search?version=true

и найдя атрибут _version.


ORIGINAL

Почему бы не позволить ES автоматически генерировать _id, а вы оставить свой id отдельно. Таким образом, вы можете написать сценарий для поиска документов с тем же id и сохранить только «правильные» документы?

Например:

2 дублирования и один уникальный

POST df/_doc
{
  "doc_id": 0,
  "email_addr": "e@f.com",
  "timestamp": 10
}

POST df/_doc
{
  "doc_id": 0,
  "email_addr": "a@b.com",
  "timestamp": 100
}

POST df/_doc
{
  "doc_id": 1,
  "email_addr": "a@e.com"
}

Затем поиск уникальных посетителей и включение, произвольно, только «самого последнего»:

GET df/_search
{
  "size": 0,
  "aggs": {
    "scripted_terms": {
      "terms": {
        "size": 1000,
        "field": "doc_id",
        "min_doc_count": 2
      },
      "aggs": {
        "top_hits_agg": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

, что дает

...
"aggregations" : {
    "scripted_terms" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 0,
          "doc_count" : 2,
          "top_hits_agg" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : null,
              "hits" : [
                {
                  "_index" : "df",
                  "_type" : "_doc",
                  "_id" : "Ev635HEBW-D5QnrWDjzH",
                  "_score" : null,
                  "_source" : {
                    "doc_id" : 0,
                    "email_addr" : "a@b.com",
                    "timestamp" : 100
                  },
                  "sort" : [
                    100
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...