我开始使用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())
为什么会这样? 非常感谢!
答案 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。