0

我的数据如下所示:

  {
    "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 都不存在于其中。请帮忙。从现在开始,我就陷入了困境。

谢谢。

4

1 回答 1

1

match在示例中使用了您想要使用的查询regexp。为此,只需使用:

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

希望这可以帮助!

于 2018-07-19T17:29:22.617 回答