首页 > 解决方案 > Kibana 的索引管理不会更新文档计数

问题描述

我开始使用 elasticsearch-dsl 使用 elasticsearch 和 kibana。我正在关注本指南:https ://elasticsearch-dsl.readthedocs.io/en/latest/index.html#persistence-example

一切似乎都很好。但是,在 Kibana 的索引管理面板中刷新统计信息时,文档计数在我执行搜索之前不会更新(可能是巧合,但我对此表示怀疑)。

这是我插入弹性的代码:

connections.create_connection(hosts=['localhost'])
for index, doc in df.iterrows():
    new_cluster = Cluster(meta={'id': doc.url_hashed}, 
                      title = doc.title,
                      cluster = doc.cluster,
                      url = doc.url,
                      paper = doc.paper,
                      published = doc.published,
                      entered = datetime.datetime.now()
                   )
    new_cluster.save()

其中“cluster”是定义我的索引结构的自定义类:

from datetime import datetime
from elasticsearch_dsl import Document, Date, Integer, Keyword, Text
from elasticsearch_dsl.connections import connections

class Cluster(Document):
    title = Text(analyzer='standard', fields={'raw': Keyword()})
    cluster = Integer()
    url = Text()
    paper = Text()
    published = Date()
    entered = Date()

    class Index:
        name = 'cluster'

    def save(self, ** kwargs):
        return super(Cluster, self).save(** kwargs)

这是我正在查看的面板:https : //www.screencast.com/t/zpEhv66Np 运行上面的“for”循环并单击 Kibana 上的“重新加载索引”按钮后,数字保持不变。他们只会改变我在我的脚本上执行搜索(仅用于测试):

s2 = Search(using=client, index="cluster")
test_df = pd.DataFrame(d.to_dict() for d in s2.scan())

为什么会这样?非常感谢!

标签: pythonelasticsearchkibana

解决方案


首先,您有 1 个节点(可能是主节点和数据),并且在索引管理中它说您的索引状态是yellow这意味着未分配副本分片(如果您只有 1 个节点,则不能拥有副本,因为副本意味着将这些主分片放在另一个节点上。如果你想要 1 个副本,你需要至少有 2 个数据节点)。您需要将索引的副本设置为 0 以使集群再次处于绿色状态:

PUT /<YOUR_INDEX>/_settings
{
    "index" : {
        "number_of_replicas" : 0
    }
}

至于索引计数,在批量操作之后需要flush将文档写入磁盘。来自文档:

刷新索引是确保当前仅存储在事务日志中的任何数据也永久存储在 Lucene 索引中的过程。重启时,Elasticsearch 会将事务日志中的所有未刷新操作重播到 Lucene 索引中,以使其恢复到重启前的状态。Elasticsearch 会根据需要自动触发刷新,使用启发式算法来权衡未刷新事务日志的大小与执行每次刷新的成本。

一旦每个操作被刷新,它就会永久存储在 Lucene 索引中。

基本上,当您批量处理 N 个文档时,您不会立即看到它们,因为它们尚未写入 Lucene 索引。flush操作完成后可以手动触发bulk

POST /<YOUR_INDEX>/_flush

然后检查索引中的文档数量:

GET _cat/indices?v&s=index

您还可以强制每 N 秒刷新一次,例如:

PUT /<YOUR_INDEX>/_settings
{
    "index" : {
        "refresh_interval" : "1s"
    }
} 

您可以在docs中阅读有关它的更多信息,但我的建议是,如果文档数量与您批量处理的文档数量相同,请不要担心它,并且使用Kibana dev tools而不是index managementGUI。


推荐阅读