首页 > 解决方案 > 使用弹性搜索查询查找多个精确值

问题描述

我在弹性搜索中插入了一些如下数据。数据 (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_dslpython 模块编写弹性搜索查询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"
              }
            }
          ]
        }

标签: pythonelasticsearchelasticsearch-dslelasticsearch-queryelasticsearch-dsl-py

解决方案


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

因此,在name_gr具有gr1gr2的情况下:

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

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

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

推荐阅读