РЕДАКТИРОВАТЬ
Да, 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
]
}
]
}
}
}
]
}
}
}