简体   繁体   English

弹性搜索查询从regexp输入参数中查找列表中值的完全匹配

[英]Elastic search query find exact match of values in the list from regexp input parameter

My data looks like below: 我的数据如下所示:

  {
    "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"]
  }

Now, i am trying to write elastic search query using elasticsearch_dsl python module by importing Q from it. 现在,我试图通过从中导入Q来使用elasticsearch_dsl python模块编写弹性搜索查询。

My input query will be some regex on "name_gr" . 我的输入查询将是"name_gr"上的一些regex For eg: "name_gr": "gr[12]" . 例如: "name_gr": "gr[12]" So, in this case I want all the names which has both "gr1" and "gr2" in their list of "name_gr". 因此,在这种情况下,我希望所有在“ name_gr”列表中同时具有“ gr1”和“ gr2”的名称。

So, the result for -> 所以,结果为->

Example 1 : "name_gr": "gr[12]" will be : 示例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"]
  }

because, gr1 and gr2 both are present in name1, name2 and name4. 因为gr1,gr2都存在于name1,name2和name4中。

Example 2: "name_gr": "gr.*" will be : 示例2: "name_gr": "gr.*"将为:

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

because, all the gr's (gr1,gr2,gr3,gr4) are present in name4 only. 因为所有gr(gr1,gr2,gr3,gr4)仅存在于name4中。

I tried writing my query like below: 我尝试像下面这样编写查询:

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

But it gives name3 also in result, which is invalid as both gr1 and gr2 are not present in it. 但是它也给出了name3,这是无效的,因为gr1和gr2都不存在。 Please help. 请帮忙。 I am stuck in this from few days now. 从现在开始,我一直陷入困境。

Thanks. 谢谢。

You are using a match query in your example where you want to be using regexp instead. 您要在示例中使用match查询,而您想改用regexp To do this just use: 为此,只需使用:

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

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM