【问题标题】:Indexing only single object field in ElasticSearch在 ElasticSearch 中仅索引单个对象字段
【发布时间】:2015-12-31 02:09:55
【问题描述】:

假设我有一些与其他类型的文档有关系的文档,比如与 regions 相关的 building

building:
  country: region
  city: region
  nearbyParks: [region]
  closestNuclearHideout: region

我需要能够按与建筑相关的任何区域执行搜索,因此我将此结构转换为:

building:
  countryId: <uuid>
  cityId: <uuid>
  nearbyParkIds: [<uuid>]
  closestNuclearHideoutId: <uuid>
  regions: [region]

但是,此时我只需要按相关区域 ID 执行搜索,并且希望禁止 ElasticSearch 为每个 regions.* 字段(regions.id 除外)编制索引以保持干净。这可能使用当前的映射 API 吗?我希望让我的弹性文档尽可能小,并让它们与后端输出保持同步,因此添加 regionIds uuid 数组字段是一种选择,但不需要。

【问题讨论】:

  • 如果您不需要有关区域的信息,您可以在 ElasticSearch 中仅存储区域 ID,并从其他存储(数据库或其他)中检索其余信息。
  • 您能否分享更多信息,即您使用的是什么客户端技术?您是如何创建索引和映射类型的?
  • @Val 我正在使用具有标准零停机别名概念的官方 java 客户端,映射是使用索引创建的。
  • @Ashalynd 是的,这就是 regionIds 字段解决方案。我试图避免它,所以后端(数据库)和弹性输出对于客户端来说是相同的。
  • 那么您能展示一下您是如何创建索引以及您正在使用的映射吗?

标签: elasticsearch


【解决方案1】:

是的,您可以关闭给定字段的dynamic 映射。因此,在映射中,您可以定义确实想要映射的字段,同时有效地禁用其余字段以供搜索。

{
  "mappings": {
    "type": {
      "properties": {
        "regions": {
          "type": "object",
          "dynamic": false,
          "properties": {
            "id": {
              "type": "string",
              "index": "not_analyzed",
              "doc_values" : true
            }
          }
        }
      }
    }
  }
}

因此,假设您已索引此文档:

{
  "regions" : [
    {
      "id" : "xyzabc",
      "field1" : "ignored",
      "field2" : "ignored"
    },
    {
      "id" : "abcdef",
      "field1" : "ignored",
      "field2" : "ignored",
      "field3" : "ignored"
    }
  ]
}

id 字段将被映射忽略,因此它们将不可搜索(没有脚本),但您将它们取回,因为_source 会导致您的命中.

【讨论】:

  • 太棒了,我无法想象我怎么会错过这个。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多