2013-07-26 75 views
1

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

我得到了一个具有特定映射的索引,其中包含字符串类型(没有给出明确的分析器)的字段(称为“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,ornot。我还发现一些规格说明query也可以是布尔值,但它们通常指的是must,shouldmust_not,这些对我来说不够灵活。但是我也发现了一些提到了operator标志的规格query,它可以设置为andor。任何信息都是值得欢迎的。

所以,我的问题现在:

  • 它是一个配置问题?这个方面有什么关系?
  • 我想通过跳过lib来测试这是否是一个库错误,那么如何使用curl来执行这个过滤操作?或任何其他图书馆(也许pyes)?
  • 是可能的几个查询(即根本不使用过滤器)的灵活组合(使用and,or,not及其组合)?我会怎么做? (最好在elasticutils中,但其他库语法,例如pyes或简单的CURL也是受欢迎的)。
+1

我可以建议您查看适用于Chrome的Sense插件(https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo?hl=en)吗?这是使用ES群集而不是CURL的强大工具。另外,我建议从pyelasticsearch开始,而不是似乎抽象得太多的东西 - 至少从(http://pyelasticsearch.readthedocs.org/)开始。 :) –

+0

我不知道这个库很好 - 有没有办法看到它用来查询ES的JSON? – argentage

回答

3

airza用CURL格式对您要查找的过滤器的回答进行了打击。我怀疑你看到的问题很大程度上是由于使用了一个抽象模块,如elasticutils - 首先熟悉底层的ES查询协议是很好的。这将使理解elasticutils更容易。正如在我上面的评论中,我建议安装谷歌浏览器插件'Sense',让您轻松查询您的ES群集:https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo?hl=en

Elasticsearch查询过滤器是非常灵活 - 和'可嵌套'。您可以很容易地在boolmust过滤器中嵌入or过滤器。例如:

{ 
    "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滤波器匹配的项目的排名将高于非匹配项目更高。

+0

感谢您提供详尽的答案和结合过滤器和查询的示例,这对我目前非常有帮助。我现在也使用直接卷曲,尽管我不乐意失去'elasticutils'库提供的所有漂亮的抽象。也许我会发现如何去启动这个库,以便它在未来能够做到我想要的,但是现在我坚持认为它不能胜任这项任务。 – Alfe

+0

我偏离了抽象(例如django-haystack),转而采用更像pyelasticsearch这样的更直接的方式来实现更大的灵活性。抽象是伟大的,直到他们没有。 :) –

1

解决这个问题卷曲的要求很简单:

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

这里没有什么特别的关系方面(这是用来获取另一个查询的各种子集的大小类型的搜索查询),但如果字段A没有编入索引,您将无法搜索并找到任何内容。但是,如果是这种情况,你的ES查询应该只是返回任何记录(因为当你查询非索引字段时,你基本上给ES没有特定的过滤指令)

查询吐出了我试图执行相当于使用这个库的ES搜索是这样的:

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

你可以看到与你跑的一样。当你调用result.all()时发生了什么?