我在做一个包含django、elasticsearch和django elasticsearch dsl的项目。我正在收集大量的数据,并将其保存到postgres,并通过django elasticsearch dsl将其索引到elasticsearch。
我遇到了一个我不能理解的问题,我也没有任何进一步的提示发生了什么:
django的models.py文件的相关部分:
class LinkDenorm(BaseModel):
...
link = CharField(null=True, max_length=2710, db_index=True)
link_expanded = TextField(null=True, db_index=True)
title = TextField(null=True, db_index=True)
text = TextField(null=True)
...
django elasticsearch dsl documents.py文件的相关部分:
@registry.register_document
class LinkDenorm(Document):
link_expanded = fields.KeywordField(attr='link_expanded')
class Index:
name = 'denorms_v10'
class Django:
model = models.LinkDenorm
fields = [
...
'link',
'title',
'text',
...
]
成功索引数据后,我将验证索引是否包含正确的字段:
curl -X GET -u <myuser>:<mypasswd> "http://<my-hostname>/denorms_v10/?pretty"
{
"denorms_v10" : {
"mappings" : {
"properties" : {
...
"link" : {
"type" : "text"
},
"title" : {
"type" : "text"
},
"text" : {
"type" : "text"
}
"link_expanded" : {
"type" : "keyword"
},
...
}
}
}
}
经过一定时间(有时是几周,有时是几天)后,索引字段会发生更改。执行与前面相同的curl查找可以得到:
curl -X GET -u <myuser>:<mypasswd> "http://<my-hostname>/denorms_v10/?pretty"
{
"denorms_v10" : {
"mappings" : {
"properties" : {
...
"link" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"text" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"link_expanded" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
...
}
}
}
}
更改发生后,查询将失败,因为数据类型不正确。在调查了elasticsearch和django日志之后,没有任何东西能够提供索引发生了什么的线索。
我有点迷路了,没什么主意了。欢迎提出任何建议。谢谢您!
1条答案
按热度按时间h22fl7wq1#
米哈,你的索引可能使用了一种没有任何索引模板的ilm。要么查询别名,要么查询下的别名正在更改。您这边的某个进程定期删除索引(取决于其大小或其中的文档数)
然后,当你的应用程序再次执行post时,它会用默认的弹性Map重新创建一个索引。