Kibana的索引管理不会更新文档数

时间:2019-10-09 16:02:56

标签: python elasticsearch kibana

我开始使用elasticsearch-dsl处理elasticsearch和kibana。我正在遵循此指南:https://elasticsearch-dsl.readthedocs.io/en/latest/index.html#persistence-example

一切似乎都正常。但是,在Kibana的索引管理面板中刷新统计信息时,文档数量直到执行搜索后才会更新(可能是巧合,但我对此表示怀疑)。

这是我插入Elastic的代码:

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()

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

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())

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

1 个答案:

答案 0 :(得分:1)

首先,您有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而不是{ {1}} GUI。