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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用弹性搜索查询查找多个精确值相关的知识,希望对你有一定的参考价值。

我在弹性搜索中插入了一些如下所示的数据。数据(name_list)如下所示。

{
  "manage": {
    "name_list": [
      {
        "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编写弹性搜索查询。

我的简单查询获取名称匹配name_gr regexp - > gr。*如下所示:

{"query":{"regexp":{"name_gr":"gr.*"}}}

查询以获取name_gr为“gr5”的名称如下所示:

{"query":{"regexp":{"name_gr":"gr5"}}}

现在,我的问题是:如果我想获得name_gr为“gr1”和“gr2”的所有名称,我的查询应该是什么?

例如:假设在这种情况下我的name_gr的正则表达式如下所示:

{"regexp":{"name_gr":"gr[12]"}}

现在,我的结果应该包含名称为name1, name2 and name4,因为名称也包含gr1 and gr2.

在这种情况下,我不知道如何形成查询,我认为我将包含“必须”,“匹配”。但不知道如何形成它。

请帮忙。

PS:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name_gr": "gr1"
          }
        },
        {
          "match": {
            "name_gr": "gr2"
          }
        }
      ]
    }
  }
}

此查询有效,但我的输入可以是正则表达式,例如:我的输入可以

gr [12],所以我的查询应该看起来像这样(语法错误,需要修复):

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "regexp": {
              "name_gr": "gr[12]"
            }
          }
        }
      ]
    }
  }
}  

所以,在上面的查询中,“匹配”部分应该在内部解析为 - >

"must": [
            {
              "match": {
                "name_gr": "gr1"
              }
            },
            {
              "match": {
                "name_gr": "gr2"
              }
            }
          ]
        }
答案

我不确定你的name_gr中有什么,我假设它只有一个值,它可能是任何东西(如:gr1,gr2,gr3 ......等)。

所以在那种情况下name_gr有gr1或gr2:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name_gr": "gr1"
          }
        },
        {
          "match": {
            "name_gr": "gr2"
          }
        }
      ]
    }
  }
}

如果name_gr是一个列表,那么您的查询将如下所示:

{
  "query": {
    "bool": {
      "must": [
        {
          "regexp":{"name_gr":"gr.*"}
        },
        {
          "regexp":{"name_gr":"gr.*"}
        }
      ]
    }
  }
}

以上是关于使用弹性搜索查询查找多个精确值的主要内容,如果未能解决你的问题,请参考以下文章

在数组中查找多个精确值

弹性搜索精确匹配

基于字段的弹性搜索计数查询,其值包含文件系统路径

ElasticSearch结构化搜索和全文搜索

来自多个弹性搜索索引的 Kibana 可视化

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