通过从 AWS Elasticsearch 服务中的 Lambda 事件中提取要匹配的字段来动态构建 Elasticsearch 查询

Build Elasticsearch query dynamically by extracting fields to be matched from the Lambda event in AWS Elasticsearch service

我想编写一个查询来匹配 Elasticsearch 中的索引字段。我正在使用 AWS Elasticsearch 服务并将查询编写为 AWS Lambda 函数。此 lambda 函数在事件发生时执行,搜索事件中发送的字段,将字段与索引文档和 returns 匹配的文档进行匹配。

但是,我们不知道要提前搜索的字段或字段数。所以我希望能够从 lambda 函数中的事件中提取字段并动态构造查询以将字段与索引文档匹配。

活动如下:

{
    "headers": {
      "Host": "***"
    },
    "queryStringParameters": {
      "fieldA": "abc",
      "fieldB": "def"
    }
  }

lambda函数如下。此函数需要两个字段并匹配它们。

def search(event, context):

    fields = list(event['queryStringParameters'].keys())
    firstField = fields[0]
    secondField = fields[1]
    
    values = list(event['queryStringParameters'].values())
    firstValue = values[0]
    secondValue = values[1]
    
    query = {
        "query": {
            "bool" : {
                "must" :[
                     {"match" : { firstField : firstValue }},
                     {"match" : { secondField : secondValue }}
                    ] 
            }
        }
    }

我如何重写我的查询,以便它动态地接受事件发送的字段和字段数(提前不知道)?

不确定您的确切要求是什么,但您可以选择以下内容:

def search(event, context):
    query = {
        "query": {
            "bool": {
                "query_string": {
                    "query": " OR ".join([
                        "(%s:'%s')" % (k, v) for (k, v) in event["queryStringParameters"].items()
                    ])
                }
            }
        }
    }

    print(query)

这会导致正确的 query_string_query:

{
  "query":{
    "bool":{
      "query_string":{
        "query":"(fieldB:'def') OR (fieldA:'abc')"
      }
    }
  }
}

您可以将 ORAND 互换。还要记住,当值用引号引起来时,ES 将 enforce exact matches。将它们排除在外,以防您遇到 contains 行为(即 match 查询)。