通过elasticutils过滤的ElasticSearch

2024-03-28 10:31:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个具有特定映射的索引,包含一个string类型的字段(比如“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的原因是它们可以通过andor和{}自由组合。我还发现了一些描述query也可以是布尔值的规范,但是它们通常引用mustshould和{},我认为这些规范不够灵活。但我也发现了一些规范,其中提到了operator标志,它可以设置为and或{}。欢迎提供任何相关信息。在

所以,我现在的问题是:

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

Tags: orand字符串text文档规范过滤器es
2条回答

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

Elasticsearch查询过滤器非常灵活,而且是可嵌套的。您可以很容易地将or过滤器嵌套在boolmust过滤器中。示例:

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

在本例中,结果必须与两个mustor过滤器和age_minterm过滤器中的一个匹配,并且should子句中与areaterm过滤器匹配的项目的排名将高于不匹配的项目。在

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

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

这里与facets(facets是一种用于获取另一个查询的各种子集大小的搜索查询类型)没有特定的关系,但是如果字段a没有被索引,您将无法搜索它并找到任何内容。但是,如果是这种情况,那么您的ES查询应该只返回任何记录(因为当您查询一个非索引字段时,实际上并没有给ES任何特定的筛选指令)

我尝试使用这个库执行等效的ES搜索时,得到的查询是:

^{pr2}$

你能看到的和你跑的一样。你打电话的时候发生了什么事结果.all() ? 在

相关问题 更多 >