1

我目前正在尝试filter通过 library 在现有的 ElasticSearch 实例中使用 a elasticutils。不幸的是,我无处可去。我不确定问题是因为我做了一些基本的错误,还是图书馆有问题(很可能是 AFAICT)。

我有一个带有特定映射的索引,包含一个字符串类型的字段(比如“A”)(没有给出明确的分析器)。该字段始终包含字符串列表。

我想通过在该字段 A 中包含给定字符串来过滤我的文档,所以我尝试了:

import elasticutils as eu
es = eu.S().es(urls=[ URL ]).indexes(INDEX).doctypes(DOCTYPE)
f = eu.F(A="text")
result = es.filter(f)

但这会返回一个空的结果集。我也尝试过使用它,f = eu.F(A__in="text")但这导致了一个很大的错误消息,其中最有趣的部分是[terms] filter does not support [A].

我想知道是否必须以不同的方式配置索引,也许我必须创建一个构面才能使用过滤器?但是我在阅读的文档中没有找到任何提示。

我想使用的原因filter是它们可以使用and,or和自由组合not。我还发现了一些描述query也可以是布尔值的规范,但它们通常指的是must, should,并且must_not我认为这对我来说不够灵活。但我还发现一些规范提到了s 的operator标志query,可以设置为andor or。欢迎提供任何相关信息。

所以,我现在的问题是:

  • 是配置问题吗?方面与此有关吗?
  • 我想通过跳过lib来测试这是否是一个库错误,那么我怎样才能使用curl来执行这个过滤操作呢?或任何其他图书馆(也许pyes)?
  • 多个查询的灵活组合(使用andornot和它们的分组)是否可能(即根本不使用过滤器)?我该怎么做?(最好在elasticutils但其他库语法中,例如pyes,或简单的 CURL 也是受欢迎的)。
4

2 回答 2

3

airza以 CURL 格式就您要查找的过滤器给出的答案一针见血。我怀疑您看到的问题主要是由于使用了抽象模块,例如elasticutils- 首先熟悉底层 ES 查询协议会很好。这将使理解elasticutils更容易。正如我在上面的评论中,我建议安装“Sense”,这是一个用于 Google Chrome 的插件,可以让您轻松查询您的 ES 集群:https ://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo?hl=en 。

Elasticsearch 查询过滤器非常灵活 - 并且“可嵌套”。您可以很容易地将过滤器嵌套在or过滤器中bool must。例子:

{
    "query": {
        "filtered": {
           "query": {
               "match_all": {}
           },
           "filter": {
               "bool": {
                   "must": [
                       {
                           "or": [
                                 {"exists": {"field": "sessions"}},
                                 {"range": {"id": {"gte": 56000}}}
                           ]
                       },
                       {
                           "term": {"age_min": "13"}
                       }
                   ],
                   "should": [
                      {
                          "term": {"area": "1"}
                      }
                   ]
               }
           }
        }
    }
}

在此示例中,结果必须与两个must or过滤器和age_min term过滤器之一匹配,并且子句中与area term过滤器匹配的should项目将比不匹配的项目排名更高。

于 2013-08-03T17:43:17.827 回答
1

解决这个问题的 CURL 请求非常简单:

curl -XPOST URL/INDEX/_search? -d '{
  "filter": {
    "term": {
      "A": "val"
    }
  }
}'

这里与构面没有特别的关系(这是一种用于获取另一个查询的各种子集大小的搜索查询),但是如果字段 A 没有被索引,您将无法搜索它并找到任何东西。但是,如果是这种情况,您的 ES 查询应该只返回任何记录(因为当您查询非索引字段时,您实际上是在给 ES 没有特定的过滤指令)

我尝试使用此库执行等效 ES 搜索时吐出的查询是这样的:

{'filter': {'term': {'language': 'EN'}

您可以看到与您运行的相同。当您调用 result.all() 时发生了什么?

于 2013-07-29T17:42:09.297 回答