我目前正在尝试使用 filter
在现有的 ElasticSearch 实例中通过库 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]
.
我想知道我是否必须以不同方式配置我的索引,也许我必须创建一个 facet 才能使用过滤器?但是我在阅读的文档中没有找到任何关于此的提示。
我想使用 filter
的原因是它们可以使用 and
自由组合, or
, 和 not
.我还找到了一些描述 query
的规范也可以是 bool 值,但它们通常指的是 must
, should
, 和 must_not
我认为这对我来说不够灵活。但我也发现了一些提到 operator
的规范query
的标志s 可以设置为 and
或 or
.欢迎提供任何相关信息。
那么,我现在的问题是:
- 是配置问题吗?方面与此有关吗?
- 我想通过跳过 lib 来测试这是否是库错误,那么我如何仅使用 curl 来执行此过滤操作?或者任何其他图书馆(可能是
pyes
)? - 是否可以灵活组合(使用
and
、or
、not
以及它们的分组)多个查询(即根本不使用过滤器)?我该怎么做? (最好在elasticutils
中,但也欢迎使用其他库语法,例如pyes
或简单的 CURL)。
最佳答案
airza 以 CURL 格式回答了您正在寻找的过滤器方面的问题。我怀疑您看到的问题主要是由于使用了像 elasticutils
这样的抽象模块——最好先熟悉底层的 ES 查询协议(protocol)。这将使理解 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
子句中将比不匹配的项目排名更高。
关于python - 通过 elasticutils 过滤的 ElasticSearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881706/