通过API将文档添加到elasticsearch,然后通过kibana发现它们。怎么样?

时间:2019-05-13 13:38:10

标签: elasticsearch kibana

我通常通过logstash插件将数据(日志)插入elasticsearch。然后我 可以从kibana搜索它们。

但是,如果我尝试以编程方式在Elasticsearch中插入数据(为了 跳过filebeat和logstash),则无法在kibana中找到数据。

这是我测试过的:

from elasticsearch import Elasticsearch
es = Elasticsearch(["XXX"], ...)
doc = {
    "@version": 1,
    "@timestamp": datetime.now(),
    "timestamp": datetime.now(),  # Just in case this is needed too
    "message": "test message"
}
res = es.index(
    index="foobar-2019.05.13", doc_type='whatever', id=3, body=doc,
    refresh=True
)
# Doc is indexed by above code, as proved by
# es.search(
#    index="foobar-*", body={"query": {"match_all": {}}}
#)

我在“索引模式->创建”中将索引模式“ foobar- *”添加到了kibana 索引模式”。然后,我可以使用“发现”页面在该页面中搜索文档 指数。但是,kibana找不到任何文件,即使这些文件存在于 弹性搜索。

我缺少什么?是否应该为索引配置任何映射?

(注意:使用6.x版本)

更新:已建立文档索引和索引映射的示例

# Example of doc indexed
{'_index': 'foobar-2019.05.13', '_type': 'doc', '_id': '41', '_score': 1.0,
 '_source': {'author': 'foobar', 'message': 'karsa big and crazy.  icarium crazy.  mappo big.',
             'timestamp': '2019-05-13T15:52:19.857898',
             '@version': 1, '@timestamp': '2019-05-13T15:52:19.857900'}}

# mapping of foobar-2019.05.13'
{
  "mapping": {
    "doc": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "long"
        },
        "author": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "message": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "timestamp": {
          "type": "date"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我发现了问题...主机之间的时区差异为2小时 python代码正在运行,elasticsearch / kibana主机。

因此,由于我使用的是datetime.now(),所以我插入的文档的时间戳是“未来几小时”,而我搜索的文档是“过去的任何地方”。

如果我将来会寻找它们(或者,如果我等待2个小时而不进行更新, 他们),就找到了。

使我难堪的错误。

解决我的问题是使用datetime.now(timezone.utc)