当前位置: 首页 > 面试题库 >

如何使用python在一个elasticsearch查询中包含范围和匹配查询?

秦光启
2023-03-14
问题内容

我必须找到具有字符串的匹配文档,例如:在某些“键”范围内的字符串:“
sky”。当我编写单独的匹配和范围查询时,我从ES中获得了输出,但是合并在一起时会抛出异常。

范围查询:

res = es.search(index="dummy",
                body={"from":0, "size":0,"query": {"range":{"key":{"gte":"1000"}}}})

匹配查询:

res = es.search(index="dummy",
                body={"from":0, "size":0,"query": {"match":{"word":"sky"}}})

组合查询:

res = es.search(index="dummy",
                body={
                  "from":0,
                  "size":0,
                  "query": {
                    "range":{
                      "key":{"gte":"1000"}
                    }
                  },
                  "match":{"word":"sky"}
                })

组合查询在执行时会引发错误:

引发HTTP_EXCEPTIONS.get(状态码,TransportError)(状态码,error_message,Additional_info)elasticsearch.exceptions.RequestError:TransportError(400,u’parsing_exception’,u’[match]中START_OBJECT的未知键。’)

合并两个查询的正确方法是什么?


问题答案:

您需要使用bool/must查询来做到这一点

res = es.search(index="dummy", body={
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "key": {
              "gte": "1000"
            }
          }
        },
        {
          "match": {
            "word": "sky"
          }
        }
      ]
    }
  }
})


 类似资料:
  • 问题内容: 我必须找到具有字符串的匹配文档,例如:在某些“键”范围内的字符串:“ sky”。当我编写单独的匹配和范围查询时,我从ES获得输出,但是合并在一起时会抛出异常。 范围查询: 匹配查询: 组合查询: 组合查询在执行时会引发错误: 引发HTTP_EXCEPTIONS.get(状态代码,TransportError)(状态代码,error_message,Additional_info)ela

  • 我是Elasticsearch新手,对匹配查询的工作方式感到困惑。我有以下映射: 我批量导入了以下文档 我验证了所有文档都已成功加载。然后我执行匹配查询: 它只返回#1文档。我在这里感到困惑。为什么它不返回所有三个文档?我应该使用什么查询来返回这三个文档,因为它们在字段中都有“quiet”根单词? 谢谢和问候。

  • 问题内容: 我想查询的数据是和是。编写常用的SQL很容易: 但是,对Elasticsearch进行查询对我来说并不容易。 首先,我查询了: 结果是我所期望的。 然后,我查询了: 它也运作良好。 但是我无法使用和操作将2个条件连接在一起的查询。如何将这两个匹配查询合并为一个使用和操作? 问题答案: 您需要的是布尔查询,您可以在其中输入所有单个查询: (我无法测试查询,这可能是错误的,但是bool-q

  • 问题内容: 我有以下 匹配 查询字符串: 我想它的意思是,但实际上它能执行。 然后我尝试了 术语 查询字符串: 它执行,显示 术语 查询通过数组支持多个OR条件。 我很好奇为什么 匹配 查询不支持通过数组的 OR 条件?并且它不显示任何语法错误。 问题答案: 该查询仅支持要指定的单个字符串值。官方文档中没有明确指定它,但是如果您愿意阅读的源代码,则可以看到,在解析字段时,解析器将跳过标记来分隔数组

  • 问题内容: 我存储的文档包含两个字段,即startDate和endDate。我想使用输入日期运行Elastic查询,并返回其startDate和endDate包含该日期的所有文档。例如, 如果我输入的日期为2015-01-02,则此文档应出现在结果中,因为输入的日期在开始日期和结束日期字段的范围内。 我可以使用一个字段进行范围查询,但由于范围仅接受一个,因此我不知道如何使用两个日期字段: 我还需要

  • 我正在努力为弹性搜索制定正确的API搜索调用,这将要求在过去1小时内获得我想要的ipv4address。 第一次尝试: {“error”:{“root\u cause”:[{“type”:“parsing\u exception”,“reason”:“未知键,用于[范围]中的START\u对象。”,“line”:10,“col”:12}],“type”:“parsing\u exception”,