别名字段类型

编辑

alias 映射定义了索引中字段的备用名称。别名可以在 搜索 请求以及其他选定的 API(如 字段能力)中替代目标字段使用。

resp = client.indices.create(
    index="trips",
    mappings={
        "properties": {
            "distance": {
                "type": "long"
            },
            "route_length_miles": {
                "type": "alias",
                "path": "distance"
            },
            "transit_mode": {
                "type": "keyword"
            }
        }
    },
)
print(resp)

resp1 = client.search(
    query={
        "range": {
            "route_length_miles": {
                "gte": 39
            }
        }
    },
)
print(resp1)
response = client.indices.create(
  index: 'trips',
  body: {
    mappings: {
      properties: {
        distance: {
          type: 'long'
        },
        route_length_miles: {
          type: 'alias',
          path: 'distance'
        },
        transit_mode: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response

response = client.search(
  body: {
    query: {
      range: {
        route_length_miles: {
          gte: 39
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "trips",
  mappings: {
    properties: {
      distance: {
        type: "long",
      },
      route_length_miles: {
        type: "alias",
        path: "distance",
      },
      transit_mode: {
        type: "keyword",
      },
    },
  },
});
console.log(response);

const response1 = await client.search({
  query: {
    range: {
      route_length_miles: {
        gte: 39,
      },
    },
  },
});
console.log(response1);
PUT trips
{
  "mappings": {
    "properties": {
      "distance": {
        "type": "long"
      },
      "route_length_miles": {
        "type": "alias",
        "path": "distance" 
      },
      "transit_mode": {
        "type": "keyword"
      }
    }
  }
}

GET _search
{
  "query": {
    "range" : {
      "route_length_miles" : {
        "gte" : 39
      }
    }
  }
}

目标字段的路径。请注意,这必须是完整路径,包括任何父对象(例如,object1.object2.field)。

搜索请求的几乎所有组件都接受字段别名。特别是,别名可以在查询、聚合和排序字段中使用,以及在请求 docvalue_fieldsstored_fields、建议和高亮显示时使用。脚本在访问字段值时也支持别名。有关例外情况,请参阅 不支持的 API 部分。

在搜索请求的某些部分和请求字段功能时,可以提供字段通配符模式。在这些情况下,通配符模式将匹配字段别名以及具体的字段。

resp = client.field_caps(
    index="trips",
    fields="route_*,transit_mode",
)
print(resp)
response = client.field_caps(
  index: 'trips',
  fields: 'route_*,transit_mode'
)
puts response
const response = await client.fieldCaps({
  index: "trips",
  fields: "route_*,transit_mode",
});
console.log(response);
GET trips/_field_caps?fields=route_*,transit_mode

别名目标

编辑

别名的目标有一些限制

  • 目标必须是一个具体的字段,而不是一个对象或另一个字段别名。
  • 目标字段必须在创建别名时存在。
  • 如果定义了嵌套对象,则字段别名必须具有与其目标相同的嵌套范围。

此外,字段别名只能有一个目标。这意味着不可能使用字段别名在单个子句中查询多个目标字段。

可以通过映射更新将别名更改为引用新的目标。一个已知的限制是,如果任何存储的渗透查询包含字段别名,它们仍将引用其原始目标。更多信息可以在渗透器文档中找到。

不支持的 API

编辑

不支持写入字段别名:尝试在索引或更新请求中使用别名将导致失败。同样,别名不能用作 copy_to 的目标或在多字段中使用。

由于别名名称不存在于文档源中,因此在执行源过滤时不能使用别名。例如,以下请求将为 _source 返回一个空结果

resp = client.search(
    query={
        "match_all": {}
    },
    source="route_length_miles",
)
print(resp)
response = client.search(
  body: {
    query: {
      match_all: {}
    },
    _source: 'route_length_miles'
  }
)
puts response
const response = await client.search({
  query: {
    match_all: {},
  },
  _source: "route_length_miles",
});
console.log(response);
GET /_search
{
  "query" : {
    "match_all": {}
  },
  "_source": "route_length_miles"
}

目前,只有搜索和字段功能 API 会接受并解析字段别名。其他接受字段名称的 API,例如 词向量,不能与字段别名一起使用。

最后,一些查询(如 termsgeo_shapemore_like_this)允许从索引的文档中获取查询信息。由于在获取文档时不支持字段别名,因此指定查找路径的查询部分不能通过别名引用字段。