【问题标题】:Elasticsearch clients for python, no solutionpython的Elasticsearch客户端,没有解决方案
【发布时间】:2012-08-01 13:54:46
【问题描述】:

在选择了带有 graylog2 的 elasticsearch 之后,我度过了非常糟糕的一周。我正在尝试使用 Python 对 ES 中的数据运行查询。

我尝试过关注客户。

  1. ESClient - 非常奇怪的结果,我认为它没有维护,query_body 没有效果它返回所有结果。
  2. Pyes - 不可读,未记录。我已经浏览了资源并且无法弄清楚如何运行一个简单的查询,也许我不是那么聪明。我什至可以以 json 格式运行基本查询,然后简单地使用 Python 对象/迭代器对结果进行分析。但 Pyes 并不容易。
  3. Elasticutils - 另一个文档,但没有完整的示例。我收到以下错误并附有代码。我什至不知道它是如何使用这个 S() 连接到正确的主机的?

    es = get_es(hosts=HOST, default_indexes=[INDEX])

    basic_s = S().indexes(INDEX).doctypes(DOCTYPE).values_dict()

结果:

 print basic_s.query(message__text="login/delete")
  File "/usr/lib/python2.7/site-packages/elasticutils/__init__.py", line 223, in __repr__
    data = list(self)[:REPR_OUTPUT_SIZE + 1]
  File "/usr/lib/python2.7/site-packages/elasticutils/__init__.py", line 623, in __iter__
    return iter(self._do_search())
  File "/usr/lib/python2.7/site-packages/elasticutils/__init__.py", line 573, in _do_search
    hits = self.raw()
  File "/usr/lib/python2.7/site-packages/elasticutils/__init__.py", line 615, in raw
    hits = es.search(qs, self.get_indexes(), self.get_doctypes())
  File "/usr/lib/python2.7/site-packages/pyes/es.py", line 841, in search
    return self._query_call("_search", body, indexes, doc_types, **query_params)
  File "/usr/lib/python2.7/site-packages/pyes/es.py", line 251, in _query_call
    response = self._send_request('GET', path, body, querystring_args)
  File "/usr/lib/python2.7/site-packages/pyes/es.py", line 208, in _send_request
    response = self.connection.execute(request)
  File "/usr/lib/python2.7/site-packages/pyes/connection_http.py", line 167, in _client_call
    return getattr(conn.client, attr)(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/pyes/connection_http.py", line 59, in execute
    response = self.client.urlopen(Method._VALUES_TO_NAMES[request.method], uri, body=request.body, headers=request.headers)
  File "/usr/lib/python2.7/site-packages/pyes/urllib3/connectionpool.py", line 294, in urlopen
    return self.urlopen(method, url, body, headers, retries-1, redirect) # Try again
  File "/usr/lib/python2.7/site-packages/pyes/urllib3/connectionpool.py", line 294, in urlopen
    return self.urlopen(method, url, body, headers, retries-1, redirect) # Try again
  File "/usr/lib/python2.7/site-packages/pyes/urllib3/connectionpool.py", line 294, in urlopen
    return self.urlopen(method, url, body, headers, retries-1, redirect) # Try again
  File "/usr/lib/python2.7/site-packages/pyes/urllib3/connectionpool.py", line 294, in urlopen
    return self.urlopen(method, url, body, headers, retries-1, redirect) # Try again
  File "/usr/lib/python2.7/site-packages/pyes/urllib3/connectionpool.py", line 255, in urlopen
    raise MaxRetryError("Max retries exceeded for url: %s" % url)
pyes.urllib3.connectionpool.MaxRetryError: Max retries exceeded for url: /graylog2/message/_search

我希望这个优秀项目的开发人员能够提供一些完整的示例。即使查看来源,我也完全不知所措。

有什么解决方案吗,用 elasticsearch 和 python 帮助我,或者我应该放弃所有这些并支付一个不错的 splunk 帐户并结束这种痛苦。

我正在继续使用 curl,下载整个 json 结果并 json 加载它。希望这行得通,尽管 curl 从 elasticsearch 下载 100 万条消息可能不会发生。

【问题讨论】:

  • 我同意...我很难让 pyes 工作..几乎没有支持..我认为责怪开发人员是不对的...我猜ES 作为一个整体是新的,我只需要有更多的耐心:)
  • 我在这里没有责怪任何人。我只是发现缺少文档,很难做出贡献。
  • 当 REST API 的文档如此完善时,您到底为什么想要一个库?

标签: python elasticsearch pyes


【解决方案1】:

我发现 rawes 非常有用: https://github.com/humangeo/rawes

这是一个相当低级的界面,但我发现使用它比使用高级界面要尴尬得多。 如果您愿意,它还支持 Thrift RPC。

【讨论】:

    【解决方案2】:

    老实说,我最幸运的只是 CURLing 一切。 ES 有很多不同的方法、过滤器和查询,以至于各种“包装器”很难重新创建所有功能。在我看来,这类似于将 ORM 用于数据库……您在易用性方面获得的收益会在灵活性/原始能力方面有所损失。

    除了 ES 的大多数包装器并不是真的那么容易使用。

    我会试一试 CURL,看看它对你有什么影响。您可以使用外部 JSON 格式化程序来检查您的 JSON,使用邮件列表查找示例,如果您使用 JSON,文档也可以。

    【讨论】:

    • 是的,我现在要走那条路,但是如何让 ES 给我完整的结果集(所有记录?)stackoverflow.com/questions/8829468/… 可能会起作用。感谢您的意见
    • 所以您只想要所有结果,而不管任何查询或评分?该帖子中描述的扫描/滚动方法对您有用。我的数据集大约有 200,000 个文档,我可以非常快速地扫描/滚动它。
    • 我的数据集是5000万个文档,每天增加300万个。我不想要所有的文档。我确实有一个简单的文本搜索查询来获得我需要的东西,这是为了减少可能的重要数据。我将在今天重新开始并发布我的结果。
    • 扫描/滚动仍然可以工作,但请注意不会对任何文档进行评分。您将能够遍历查询的所有结果,但不知道结果通常会按哪个顺序排序。如果您觉得这没问题,那么扫描/滚动将比执行普通查询快得多。除此之外,您可以使用普通查询并使用“_from”和“_size”对其进行分页
    • 是的,我只需要结果,排序,查询可以在 ES 之外完成。我现在的问题是,在使用扫描/滚动时,elasticsearch 无法处理这么多数据,它似乎被阻塞了,除了在滚动时传入的数据。老实说,这比mysql差得多。
    【解决方案3】:

    显式设置主机为我解决了该错误:

    basic_s = S().es(hosts=HOST, default_indexes=[INDEX])

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 谢谢。这绝对是有帮助的。请您将此链接添加到 github 自述文件中。非常喜欢。
      • 我不是它的维护者,但我会开票:)
      【解决方案5】:

      ElasticSearch recently(2013 年 9 月)发布了官方 Python 客户端 elasticsearch-py(PyPI 上的 elasticsearch,也在 github 上),它应该是与官方 ElasticSearch API 的相当直接的映射。我还没用过,但看起来很有希望,至少它会匹配官方文档!

      编辑:我们开始使用它,我对它非常满意。 ElasticSearch 的 API 非常干净,而 elasticsearch-py 维护了这一点。总体上更易于使用和调试,而且日志记录也不错。

      【讨论】:

        【解决方案6】:

        ElasticUtils 有示例代码:http://elasticutils.readthedocs.org/en/latest/sampleprogram1.html

        如果您需要文档中的其他内容,请直接询问。

        【讨论】:

        • 是的,我已经尝试过了,并在上面发布了我的错误。我不需要添加索引等,我只需要使用示例中所示方法的查询结果,但根据我的问题它失败了。关于我做错了什么有什么想法吗?
        • MaxRetryError 表明它无法连接到您指定的主机。所以要么 HOST 设置错误,要么 ElasticSearch 没有运行。
        • 语法可能是问题所在。我发现在 0.6 和 0.7 版本之间,如何声明服务器的位置发生了变化。曾经它只是一个主机,现在它是一个 URL(或类似的)。也许你遇到了同样的问题。我通过直接从 github 安装最新版本的 ElasticUtils 解决了这个问题。
        猜你喜欢
        • 1970-01-01
        • 2012-06-17
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多