elasticsearch,dsl,Json,elasticsearch,Dsl" /> elasticsearch,dsl,Json,elasticsearch,Dsl" />

Json 在Elasticsearch中混合使用DSL和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

我正在尝试编写一个python类,该类将格式正确的Elasticsearch JSON查询作为参数。到现在为止,一直都还不错。。但是,作为该类的一部分,我还希望使用“to”和“from”参数来限制查询运行的日期范围

有没有一种方法可以将DSL查询的JSON与URI参数结合起来以传递日期和时间约束

我知道我可以使用如下范围参数限制时间:

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手册,我想它会给你带来价值。如果你对什么话题感兴趣,手册一出我就告诉你!