在ElasticSearch中连接不同索引之间的数据,其中一个字段具有ID列表,每个IDMap到另一个索引中的ID

3zwtqj6y  于 7个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(68)

我有2个索引。一个包含一些关于产品的数据。这个索引已经存在,并正在多个地方使用。我想创建一个关于用户的愿望清单,可以包含多个产品的新索引。每个用户可以包含多个愿望清单。我想获取所有产品,给定用户ID和愿望清单名称。

  • 我被允许以任何我希望的方式构建WISHLIST索引,但不能在Product索引中发生重大更改。
  • 如果解决方案允许分页,那就更好了。
INDEX PRODUCT
[{
productid: 123,
name: abc,
available: true
},{
productid: 456,
name: abcder,
available: false
} ]

INDEX USER_WISHLIST
[{
userid: 1,
wishlist_name: xyz,
product_ids: [123, 456]
},
{userid: 2,
wishlist_name: pqr,
product_ids: [123]
},
{userid: 1,
wishlist_name: yyy,
product_ids: [456]
}

字符串

oipij1gg

oipij1gg1#

Elasticsearch不支持索引之间的传统SQL连接。

然而,Elasticsearch提供了一个enrich处理器,可以用来将现有索引中的数据添加到新索引中。这可以用作一种解决方案来实现类似的结果。
这里有一个例子:
1.首先,创建一个丰富策略,定义要丰富的索引、要匹配的字段以及要包含在丰富数据中的字段:

PUT /_enrich/policy/product_policy
{
  "match": {
    "indices": "product",
    "match_field": "productid",
    "enrich_fields": ["name", "available"]
  }
}

字符串
1.然后,执行策略:

POST /_enrich/policy/product_policy/_execute


1.接下来,创建一个管道,它使用丰富处理器在文档被索引到USER_WISHLIST索引时丰富文档:

PUT _ingest/pipeline/enrich_pipeline
{
  "processors": [
    {
      "enrich": {
        "policy_name": "product_policy",
        "field": "product_ids",
        "target_field": "product_details"
      }
    }
  ]
}


1.现在,当您将文档索引到USER_WISHLIST索引中时,请使用管道:

PUT /user_wishlist/_doc/1?pipeline=enrich_pipeline
{
  "userid": 1,
  "wishlist_name": "xyz",
  "product_ids": [123, 456]
}


USER_WISHLIST索引中的结果文档将具有一个附加字段“product_details”,该字段包含“product_ids”字段中每个产品id的产品名称和可用性。
以下是官方的Elasticsearch丰富示例:https://www.elastic.co/guide/en/elasticsearch/reference/current/match-enrich-policy-type.html

相关问题