elasticsearch文档字段类型索引自动更改

sigwle7e  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(430)

我在做一个包含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日志之后,没有任何东西能够提供索引发生了什么的线索。
我有点迷路了,没什么主意了。欢迎提出任何建议。谢谢您!

h22fl7wq

h22fl7wq1#

米哈,你的索引可能使用了一种没有任何索引模板的ilm。要么查询别名,要么查询下的别名正在更改。您这边的某个进程定期删除索引(取决于其大小或其中的文档数)
然后,当你的应用程序再次执行post时,它会用默认的弹性Map重新创建一个索引。

相关问题