首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticSearch删除和重新创建索引

ElasticSearch删除和重新创建索引
EN

Stack Overflow用户
提问于 2022-05-15 07:18:32
回答 1查看 235关注 0票数 0

我刚刚开始学习Elasticsearch索引;然而,在我的日常工作中,我需要每天更新es索引。您可能假设数据每天都在变化,所以我删除我的索引名并重新创建相同的索引,并将数据插入重新创建的es-index中,但有时我们的客户端会说数据有时会消失,在重新刷新之后,它会稍后出现,因此会影响来自客户端的请求?请问这是否是更新索引的正确方法,我知道有一个叫做update by查询方法,但我只想知道这是否是更新es索引的坏方法?或者它将如何影响在网页上出现的结果,由前端开发人员调用?

基本上,我的代码如下所示:

代码语言:javascript
复制
    if self.es.indices.exist(index=idx):
        self.es.indices.delete(index=idx)
    self.es.indices.create(index=idx, body=body)
    for line in self.course_info_df.collect():
        tmp = line.asDict()
        output = {"x": tmp['x'],
                  "y": tmp['y'],
                  "z": tmp['z']
        self.es.index(index=idx, doc_type='doc', body=output)

这是一个叫做ElasticSearch的python库,每次我检查索引是否存在,如果存在,我就删除它并重新创建新的索引。

然而,我需要重新创建新索引的原因,因为我需要更新我们的再推荐服务的数据,所以我提交离线作业集群,然后将这些结果存储到es-index中,所以您可以假设我使用ES作为数据库来存储数据,因为前端开发人员将使用它将数据写入网页。

还是支持一些函数将数据作为es格式的数据上传到es索引中?

EN

回答 1

Stack Overflow用户

发布于 2022-05-15 14:57:42

我不明白为什么每天都对所有文档进行索引,但这可能类似于业务逻辑。不管怎么说。以下是给你的一些解决方案:

解决方案1

您可以在这些方面使用aliases。想一想,你有产品,你想要重新索引他们每天。因此,第一天,您可以创建一个索引为products-00001。可以将所有数据索引到此索引,并且可以使用以下请求创建别名为products

代码语言:javascript
复制
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "products-00001",
        "alias": "products"
      }
    }
  ]
}

因此,第二天,您可以为集群创建另一个索引,作为products-00002,并首先将所有数据索引到新的索引中。然后,可以将别名切换到新索引:

代码语言:javascript
复制
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "products-00002",
        "alias": "products"
      }
    },
    {
      "remove": {
        "index": "products-00001",
        "alias": "products"
      }
    }
  ]
}

上面对于products-00002有一个add操作,对于products-00001有一个remove操作。因此,别名将从products-00001中删除并附加到products-00002中。在此操作之后,可以删除products-00001索引。第二天,您可以创建新的索引,再次解释为products-00003。诸若此类。

在前端,他们将使用products名称作为索引名.他们不会改变他们这边的任何东西。

有关更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/aliases.html#aliases

解决方案2

我认为循环所有文档可以重新索引它们可能是错误的。在我看来,这是错误的。但是,根据一些业务逻辑,这可能是正确的。不管怎么说。您可以使用更新操作。在这种情况下,您不需要使用别名或其他东西。只是,1次您需要索引所有文档,然后对每次文档更新,您需要更新文档1乘1或批量方式。您甚至可以使用部分更新。据我所知,您甚至已经了解_update_by_query了。您只需要知道,这些更新将增加索引的已删除文档数量:

代码语言:javascript
复制
GET _cat/indices?v&s=index&h=index,docs.count,docs.deleted

index                                 docs.count docs.deleted
some-index.analytics.2022.05                   1            0
some-index.other.2022.05                    3058          250

如上面所示,您可以看到带有_cat/indices请求的已删除文档的数量。这些已删除的文档可能会影响搜索性能。由于这个原因,您需要一次一次地合并操作,或者需要在索引上配置正确的频率,但是在执行任何操作之前,请阅读以下页面:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72246266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档