弹性搜索查询从regexp输入参数

时间:2018-07-18 21:55:52

标签: python elasticsearch elasticsearch-dsl elasticsearch-query elasticsearch-dsl-py

我的数据如下:

  {
    "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导入Q来使用regex python模块编写弹性搜索查询。

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

所以,->

的结果

示例1: { "name": "name1", "name_gr": ["gr1","gr2"] }, { "name": "name2", "name_gr": ["gr1","gr2"] }, { "name": "name4", "name_gr": ["gr1","gr2","gr3","gr4"] } 将是:

"name_gr": "gr.*"

因为gr1,gr2都出现在name1,name2和name4中。

示例2: { "name": "name4", "name_gr": ["gr1","gr2","gr3","gr4"] } 将是:

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

因为所有gr(gr1,gr2,gr3,gr4)都仅出现在name4中。

我尝试如下编写查询:

node.js

但是它也给出了name3,这是无效的,因为gr1和gr2都不存在。请帮忙。从现在开始,我一直陷入困境。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

希望这会有所帮助!