如何为我的应用重建索引?

0 投票
1 回答
1261 浏览
提问于 2025-04-17 16:08

我正在建立一个索引,似乎是这样工作的:

    doc = search.Document(doc_id=str(article.key()), fields=[
        search.TextField(name='title', value=article.title),
        search.TextField(name='text', value=article.text),
        search.TextField(name='city', value=article.city),
        search.TextField(name='region', value=article.region),
        search.NumberField(name='cityID', value=city_entity.key().id()),
        search.NumberField(name='regionID', value=region_entity.key().id()),
        search.NumberField(name='category', value=int(article.category)),
        search.NumberField(name='constant', value=1),
        search.NumberField(name='articleID', value=article.key().id()),
        search.TextField(name='name', value=article.name)
        ], language='en')
    search.Index(name='article').add(doc)

这个应用程序会获取一篇新文章,然后通过上面的代码来填充索引,这个过程看起来是有效的。索引建立好了,我可以通过搜索API来搜索这些实体。但是,我不想保留超过60天的旧文章,那我该怎么调整呢?每个实体都有一个“创建”和“更新”的时间戳:

added = db.DateTimeProperty(verbose_name='added', auto_now_add=True)  # readonly
modified = db.DateTimeProperty(verbose_name='modified',
                                   auto_now_add=True)

我应该设置一个每天运行一次的定时任务,来重建整个索引,还是设置一个每天运行一次的定时任务,来从索引中删除最旧的实体呢?现在我没有把addedmodified这些变量添加到索引中,但它们在索引中可能也很有用,比如我想搜索某个特定的时间戳。所以现在我看到这个索引工作正常,我想问一下,我是否也应该对索引变量进行操作,把addedmodified这两个变量添加到索引中?

1 个回答

1

索引是自动生成并不断更新的,你对这个过程没有控制权。当某个实体被修改(或者创建/删除)时,索引就会更新。你无法选择不让某些实体参与这个过程。

如果你根本不需要旧的文档,那就把它们删除掉。

但无论是提供服务还是删除文档,你都需要使用多个相等条件的过滤器(比如在 titletextcity 等字段上),还需要一个不等条件的过滤器(在 created 字段上),所以你需要配置一个复合索引

撰写回答