弹性搜索查询 - 在对象数组中

Elastic search Query - in array of objects

我创建了一个包含 100 多个文档的索引,这里是示例 2 个文档

文档 1:

"OfficeId": 1, "Officename": "Washers Ltd", "customers": [

{
    "customerid":10,
    "customername": Mike,
    "customerphone": 1111111111
}
,
{
    "customerid":20,
    "customername": Angie,
    "customerphone": 2222222222
} ]

文档 2:

"OfficeId": 2, "Officename": "Coldwell Ltd", "customers": [

{
    "customerid":30,
    "customername": Nathan,
    "customerphone": 1111111111
} ]

在 UI 中,我们可以按客户名称或客户phone 进行搜索。当我按 phone 1111111111 搜索时,我应该得到 2 个文档(命中 0,命中 1)但在第一个 document/hit 0 中,我如何过滤只显示 1 个对象?

您需要使用nested query along with inner_hits

添加具有索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "customers": {
        "type": "nested"
      }
    }
  }
}

索引数据:

{
  "OfficeId": 2,
  "Officename": "Coldwell Ltd",
  "customers": [
    {
      "customerid": 30,
      "customername": "Nathan",
      "customerphone": 1111111111
    }
  ]
}
{
  "OfficeId": 1,
  "Officename": "Washers Ltd",
  "customers": [
    {
      "customerid": 10,
      "customername": "Mike",
      "customerphone": 1111111111
    },
    {
      "customerid": 20,
      "customername": "Angie",
      "customerphone": 2222222222
    }
  ]
}

搜索查询:

{
  "query": {
    "nested": {
      "path": "customers",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "customers.customerphone": "1111111111"
              }
            }
          ]
        }
      },
      "inner_hits": {}
    }
  }
}

搜索结果将是

"hits": [
      {
        "_index": "67228476",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "OfficeId": 1,
          "Officename": "Washers Ltd",
          "customers": [
            {
              "customerid": 10,
              "customername": "Mike",
              "customerphone": 1111111111
            },
            {
              "customerid": 20,
              "customername": "Angie",
              "customerphone": 2222222222
            }
          ]
        },
        "inner_hits": {
          "customers": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 1.0,
              "hits": [
                {
                  "_index": "67228476",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "customers",
                    "offset": 0
                  },
                  "_score": 1.0,
                  "_source": {
                    "customerid": 10,           // note this
                    "customername": "Mike",
                    "customerphone": 1111111111
                  }
                }
              ]
            }
          }
        }
      },
      {
        "_index": "67228476",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "OfficeId": 2,
          "Officename": "Coldwell Ltd",
          "customers": [
            {
              "customerid": 30,
              "customername": "Nathan",      
              "customerphone": 1111111111
            }
          ]
        },
        "inner_hits": {
          "customers": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 1.0,
              "hits": [
                {
                  "_index": "67228476",
                  "_type": "_doc",
                  "_id": "2",
                  "_nested": {
                    "field": "customers",
                    "offset": 0
                  },
                  "_score": 1.0,
                  "_source": {
                    "customerid": 30,       // note this
                    "customername": "Nathan",
                    "customerphone": 1111111111
                  }
                }
              ]
            }
          }
        }
      }
    ]

更新 1:

如果您想再包含一个 match 子句,请使用此查询

{
  "query": {
    "nested": {
      "path": "customers",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "customers.customerphone": "1111111111"
              }
            },
            {
              "match": {
                "customers.customername": "Nathan"
              }
            }
          ]
        }
      },
      "inner_hits": {}
    }
  }
}