【问题标题】:Elasticsearch - Mapping fields from other indicesElasticsearch - 从其他索引映射字段
【发布时间】:2020-08-06 14:11:17
【问题描述】:

如何在 Elasticsearch 7 中定义映射以使用来自另一个索引的字段值来索引文档?例如,如果我有一个users 索引,该索引具有nameemailaccount_number 的映射,但account_number 值实际上在另一个名为accounts 的索引中,在字段number 中。

我尝试过这样的事情,但没有成功(我只在结果中看到“姓名”、“电子邮件”和“帐户 ID”):

PUT users/_mapping
{
  "properties": {
    "name": {
      "type": "text"
    },
    "email": {
      "type": "text"
    },
    "account_id": {
      "type": "integer"
    },
    "accounts": {
      "properties": { 
        "number":  {
          "type": "text"
        }
      }
    }
  }
}

accounts 索引具有以下映射:

{
  "properties": {
    "name": {
      "type": "text"
    },
    "number": {
      "type": "text"
    }
  }
}

【问题讨论】:

  • 你说的是字段的映射还是字段的实际值?映射是每个索引的,您不能导入映射,最接近它的是使用将相同映射应用于多个索引模式的索引模板,从版本 7.8+ 开始,您还拥有组件模板。您也不能使用来自 indexB 的值来​​索引 indexA 中的字段,而无需使用 logstash 或一些自定义脚本查询 indexB。
  • 关于你的最后一句话,我想这就是我想要完成的。用户有一个 account_id 字段,我希望用户文档包含基于 account_id 的帐户索引中的帐号。除非手动创建,否则这是不可能的,对吗?

标签: elasticsearch


【解决方案1】:

据我了解,您希望像在关系数据库中那样实现字段连接。在 elasticsearch 中,只有当文档在同一个索引中时,这才有可能。 (Link to doc)。但在我看来,在您的情况下,您需要以不同的方式工作,我认为您的 Account 对象需要为 User 的 nested

PUT /users/_mapping
{
  "mappings": {
    "properties": {
      "account": {
        "type": "nested"
       }
     }
   } 
}

您可以将其作为单独的文档进行进一步搜索。

GET /users/_search
{
  "query": {
    "nested": {
      "path": "account",
      "query": {
        "bool": {
          "must": [
            { "match": { "account.number": 1 } }
          ]
        }
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多