弹性搜索查询在regexp输入参数的列表中查找值的精确匹配

问题描述 投票:0回答:1

我的数据如下所示:

  {
    "name": "name1",
    "name_gr": ["gr1","gr2"]
  },
  {
    "name": "name2",
    "name_gr": ["gr1","gr2"]
  },
  {
    "name": "name3",
    "name_gr": ["gr2","gr3"]
  },
  {
    "name": "name4",
    "name_gr": ["gr1","gr2","gr3","gr4"]
  },
  {
    "name": "name4",
    "name_gr": ["gr4","gr5"]
  }

现在,我正在尝试使用elasticsearch_dsl python模块编写弹性搜索查询,方法是从中导入Q

我的输入查询将是regex上的一些"name_gr"。例如:"name_gr": "gr[12]"。因此,在这种情况下,我希望所有在“name_gr”列表中同时包含“gr1”和“gr2”的名称。

所以,结果为 - >

示例1:"name_gr": "gr[12]"将是:

  {
    "name": "name1",
    "name_gr": ["gr1","gr2"]
  },
  {
    "name": "name2",
    "name_gr": ["gr1","gr2"]
  },
  {
    "name": "name4",
    "name_gr": ["gr1","gr2","gr3","gr4"]
  }

因为,gr1和gr2都存在于name1,name2和name4中。

示例2:"name_gr": "gr.*"将是:

  {
    "name": "name4",
    "name_gr": ["gr1","gr2","gr3","gr4"]
  }

因为,所有gr(gr1,gr2,gr3,gr4)仅存在于name4中。

我尝试编写如下的查询:

must = [{'match':{'regexp': {'name_gr': 'gr[12]'}}}]
result = Q('bool', must = must)

但它也会在结果中给出name3,这是无效的,因为gr1和gr2都不存在。请帮忙。我几天就陷入困境。

谢谢。

python elasticsearch elasticsearch-dsl elasticsearch-query elasticsearch-dsl-py
1个回答
1
投票

您在示例中使用的是match查询,而您希望使用regexp。要做到这一点,只需使用:

s = Search().query('regexp', name_gr='gr[12]')
s.execute()

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.