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

时间:2018-07-17 07:14:08

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

我在弹性搜索中插入了如下数据。数据(名称列表)如下所示。

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

1 个答案:

答案 0 :(得分:0)

我不确定您的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.*"}
        }
      ]
    }
  }
}