Json 在Elasticsearch中混合使用DSL和URI查询
我正在尝试编写一个python类,该类将格式正确的Elasticsearch JSON查询作为参数。到现在为止,一直都还不错。。但是,作为该类的一部分,我还希望使用“to”和“from”参数来限制查询运行的日期范围 有没有一种方法可以将DSL查询的JSON与URI参数结合起来以传递日期和时间约束 我知道我可以使用如下范围参数限制时间:Json 在Elasticsearch中混合使用DSL和URI查询,json,
elasticsearch,dsl,Json,
elasticsearch,Dsl,我正在尝试编写一个python类,该类将格式正确的Elasticsearch JSON查询作为参数。到现在为止,一直都还不错。。但是,作为该类的一部分,我还希望使用“to”和“from”参数来限制查询运行的日期范围 有没有一种方法可以将DSL查询的JSON与URI参数结合起来以传递日期和时间约束 我知道我可以使用如下范围参数限制时间: GET /my-awesome-index*/_search { "query": { "bool
GET /my-awesome-index*/_search
{
"query":
{
"bool":
{
"must": [{"match_all": {}}],
"filter":
[
{"range": {"date_time": {"gte": "now-24h","lte": "now"}}},
{"match_phrase": {"super_cool_field": "foo"}},
{
"bool":
{
"should":
[
{"match_phrase": {"somewhat_cool_field_1": "bar"}},
{"match_phrase": {"somewhat_cool_field_2": "boo-ta"}}
],
"minimum_should_match": 1
}
}
]
}
}
}
这一切都很好。。但是,我想精心设计我的类,使时间框架成为一个变量。我也知道我可以通过像这样提交URL来限制时间
GET /my-awesome-index*/_search?q=date_time:[1611732033412+TO+1611777796000]
{
"query":
{
"bool":
{
"must": [{"match_all": {}}],
"filter":
[
{"match_phrase": {"super_cool_field": "foo"}},
{
"bool":
{
"should":
[
{"match_phrase": {"somewhat_cool_field_1": "bar"}},
{"match_phrase": {"somewhat_cool_field_2": "boo-ta"}}
],
"minimum_should_match": 1
}
}
]
}
}
}
然而,当我提交弹性搜索时,似乎只考虑URI的时间框架,而完全忽略DSL JSON。
<强>有没有办法得到弹性来考虑/连接两个查询为一个?< /强>
我正在考虑以编程方式使范围查询像这样range_part = '{{"range":{{"{}":{{"gte":"{}","lte":"{}"}}}}}}'.format(field,start,end)
然后动态地插入到类接受的任何JSON中。。但这似乎很麻烦,因为查询和查找字符串的位置等有太多的可用格式。您对
q
的怀疑是正确的。引述:
q
参数覆盖请求正文中的查询参数。如果指定了这两个参数,则不会返回与查询
请求正文参数匹配的文档
因此,q
和query
不能组合
至于“以编程方式进行范围查询”——因为您不知道将以何种格式接收查询,标准方法是遍历查询json,找到/创建正确的bool must/bool过滤器,并在那里设置范围查询
但是让我们后退一步——也许你的班级不应该期待一个预先烘烤的JSON查询。为什么不传递一个查询配置数组,比如
[
{
"type": "match_phrase",
"field": "super_cool_field",
"value": "foo"
},
...
]
然后自己构建查询?这样,您就可以完全控制向下游传递给ES的内容。另外,添加日期范围查询将是小菜一碟…Hey。。感谢您的评论、建议和文档中的详细信息。我真的很感谢你的帖子。我有点希望不必从头开始建造一些东西,但我想这就是我最终要做的。非常感谢你,我很高兴它起了作用。是的——看起来你必须从头开始构建它,但控制传递给ES的内容从根本上来说是好的——“永远不要相信你的用户。”嘿,顺便说一句?我正在完成一本elasticsearch手册,我想它会给你带来价值。如果你对什么话题感兴趣,手册一出我就告诉你!