3

我有一些客户文档,我想使用 ElasticSearch 根据客户的来源(国家字段在一系列国家/地区中)进行检索。

[
  {
    "name": "A1",
    "address": {
      "street": "1 Downing Street"
      "country": {
        "code": "GB",
        "name": "United Kingdom"
      }
    }
  },
  {
    "name": "A2",
    "address": {
      "street": "25 Gormut Street"
      "country": {
        "code": "FR",
        "name": "France"
      }
    }
  },
  {
    "name": "A3",
    "address": {
      "street": "Bonjour Street"
      "country": {
        "code": "FR",
        "name": "France"
      }
    }
  }
]

现在,我的 Python 代码中有另一个数组:

["DE", "FR", "IT"]

我想获得 A2 和 A3 这两个文件。

我将如何在 PyES/Query DSL 中编写这个?我应该为此使用 ExistsFilter 还是 TermQuery。ExistsFilter 似乎只检查字段是否存在,而不关心值。

4

1 回答 1

3

在 NoSQL 类型的文档存储中,您得到的只是文档,而不是文档的一部分。

您的要求:“我想获得两个文档,A2 和 A3。 ”意味着您需要分别索引每个文档,而不是另一个“父”文档中的数组。

如果您需要同时匹配父文档的值,country那么您需要对数据进行非规范化并将父文档中的这些值也存储在每个子文档中。

完成上述操作后,查询就很容易了。我假设该country字段映射为:

国家:{类型:“字符串”,索引:“not_analyzed”}

要查找带有 的文档DE,您可以执行以下操作:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "term" : {
               "country" : "DE"
            }
         }
      }
   }
}
'

要使用DE或查找文档FR

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "terms" : {
               "country" : [
                  "DE",
                  "FR"
               ]
            }
         }
      }
   }
}
'

要将上述内容与其他一些查询术语结合起来:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "terms" : {
               "country" : [
                  "DE",
                  "FR"
               ]
            }
         },
         "query" : {
            "text" : {
               "address.street" : "bonjour"
            }
         }
      }
   }
}
'

另请参阅此答案,以了解对象数组如何变得棘手,因为它们被展平的方式:

是否可以在 ElasticSearch 中对嵌套文档进行排序?

于 2012-08-17T08:46:09.583 回答