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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弹性搜索查询在regexp输入参数的列表中查找值的精确匹配相关的知识,希望对你有一定的参考价值。

我的数据如下所示:

  {
    "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都不存在。请帮忙。我几天就陷入困境。

谢谢。

答案

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

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

希望这可以帮助!

以上是关于弹性搜索查询在regexp输入参数的列表中查找值的精确匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在弹性搜索查询中传递特定字段的值列表

使用弹性搜索查询查找多个精确值

使用弹性搜索地理功能查找最常见的位置?

搜索特定值的嵌套字典列表[重复]

弹性搜索 MoreLikeThis 查询从不返回结果

命名查询根据包含某些值的列表(实例变量)查找所有实体