from django_elasticsearch_dsl import Document, fields, Index from .models import AchievementData, User, ElasticNews from .indexes import * ACHIEVEMENT_INDEX = Index(ACHIEVEMENT_INDEX_NAME) ACHIEVEMENT_INDEX.settings(number_of_shards=1, number_of_replicas=0) USER_INDEX = Index(USER_INDEX_NAME) USER_INDEX.settings(number_of_shards=1, number_of_replicas=0) GLOBAL_INDEX = Index(GLOBAL_INDEX_NAME) GLOBAL_INDEX.settings(number_of_shards=1, number_of_replicas=0) @ACHIEVEMENT_INDEX.doc_type class AchievementDocument(Document): """获奖数据文档映射""" writer_id = fields.TextField(fields={'keyword': {'type': 'keyword'}}) time = fields.DateField() data = fields.TextField( analyzer='ik_max_word', search_analyzer='ik_smart', fields={'keyword': {'type': 'keyword'}} ) image = fields.KeywordField() class Django: model = AchievementData # fields列表应该只包含需要特殊处理的字段,或者可以完全省略 # 因为我们已经显式定义了所有字段 @USER_INDEX.doc_type class UserDocument(Document): """用户数据文档映射""" user_id = fields.LongField() username = fields.KeywordField() email = fields.KeywordField() password_hash = fields.KeywordField() password_salt = fields.KeywordField() permission = fields.IntegerField() # 还是2种权限,0为管理员,1为用户(区别在于0有全部权限,1在数据管理页面有搜索框,但是索引到的录入信息要根据其用户id查询其key,若其中之一与用户的manage_key字段匹配就显示否则不显示) key = fields.KeywordField(multi=True) #表示该用户的关键字,举个例子:学生A的key为"2024届人工智能1班","2024届","计算机与人工智能学院" 班导师B的key为"计算机与人工智能学院" manage_key = fields.KeywordField(multi=True) #表示该用户管理的关键字(非管理员)班导师B的manage_key为"2024届人工智能1班" #那么学生A就可以在数据管理页面搜索到自己的获奖数据,而班导师B就可以在数据管理页面搜索到所有人工智能1班的获奖数据。也就是说学生A和班导师B都其实只有用户权限 class Django: model = User # fields列表应该只包含需要特殊处理的字段,或者可以完全省略 # 因为我们已经显式定义了所有字段 @GLOBAL_INDEX.doc_type class GlobalDocument(Document): type_list = fields.KeywordField() keys_list = fields.KeywordField(multi=True) class Django: model = ElasticNews @GLOBAL_INDEX.doc_type class RegistrationCodeDocument(Document): code = fields.KeywordField() #具体值 keys = fields.KeywordField(multi=True) #对应的key manage_keys = fields.KeywordField(multi=True) #对应的manage_key created_at = fields.DateField() #创建时间 expires_at = fields.DateField() #过期时间 created_by = fields.LongField() #创建者id class Django: model = ElasticNews