欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch-2.4.x > Mapping > Meta-fields > _all

程序员文章站 2022-07-14 20:54:15
...

_all字段

_all字段是一个特殊的catch-all字段.它把其他字段的值连接成一个大的string,使用空格作为分隔符.然后进行分析和索引,但是不被存储.这就意味着它可以被搜索,但是不能取出,高亮.
_all字段允许查询文档值但不知道哪个字段包含的值.这对开始使用新的数据集的时候是有用的.例如:

PUT my_index/user/1                                                           (1)
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET my_index/_search
{
  "query": {
    "match": {
      "_all": "john smith 1970"
    }
  }
}

(1) 这个_all字段包含的term[“john”,”smith,”1970”,”10”,”24”]

note : 所有值都被视为string
date_of_birth 字段在上述的例子中被指定为date类型的字段并且索引为一个表示1970-10-24 00:00:00 UTC的单一term.因为_all视所有值为string,所以该字段值会被索引为三个term [“1970”,”24”,”10”]
更要注意的是:_all字段将每个字段的原始值组合成为string,而没有把每个字段的term合并起来.

_all字段是一个string field,并接受其他string字段接受的相同参数. 包含 : analzyer , term_vectors , index_options and store.
_all字段需要额外的cpu周期和更多的磁盘空间.如果不需要的话,可以完全禁用或者自定义_all字段

使用_all字段查询

query_string and simple_query_string查询默认都是针对_all字段.除非指定了另一个字段

GET _search
{
  "query": {
    "query_string": {
      "query": "john smith 1970"
    }
  }
}

其他的查询,比如 match 和 term 查询你需要显示的指定_all字段,根据上述第一个例子

禁用_all字段

每个类型通过设置enabled:false将_all字段完全禁用

PUT my_index
{
  "mappings": {
    "type_1": {                                                                    (1)
      "properties": {...}
    },
    "type_2": {                                                                    (2)
      "_all": {
        "enabled": false
      },
      "properties": {...}
    }
  }
}

(1) type_1的_all是启用的
(2) type_2的_all是完全禁用的

如果_all字段是禁用的,query_string and simple_query_string将不能用于查询.你可以将它们配置为使用不同的字段 index.query.default_field setting:

PUT my_index
{
  "mappings": {
    "my_type": {
      "_all": {
        "enabled": false                                                                 (1)
      },
      "properties": {
        "content": {
          "type": "string"
        }
      }
    }
  },
  "settings": {
    "index.query.default_field": "content"                                               (2)
  },
}

(1) my_type类型_all字段是禁用的
(2) query_string默认查询content字段

从_all字段中排除字段

可以使用include_in_all设置从_all字段包含或者排除的单独字段

index boosting和_all字段

单个字段可以在索引的时候提高权重,使用boost参数._all字段考虑了这些提升.

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "title": {                                                                        (1)
          "type": "string",
          "boost": 2
        },
        "content": {                                                                      (2)
          "type": "string"
        }
      }
    }
  }
}

(1) 当查询_all字段的时候,title字段的词的相关性会是后者的两倍
(2) content字段的词

warning: 在_all字段中使用 index-time boosting对查询性能有显著的影响.通常更好的解决方案是单独查询字段.

自定义_all字段

虽然一个索引只有一个all字段,但是copy_to参数允许创建多个自定义_all字段.例如:first_name and last_name合并到full_name

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "first_name": {
          "type":    "string",
          "copy_to": "full_name"                                     (1)
        },
        "last_name": {
          "type":    "string",
          "copy_to": "full_name"                                     (2)
        },
        "full_name": {
          "type":    "string"
        }
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET myindex/_search
{
  "query": {
    "match": {
      "full_name": "John Smith"
    }
  }
}

(1) first_name 和 last_name值被copy到full_name字段.
(2)

高亮和_all字段

如果一个string值是可以获得的,那么这个字段就可以被高亮显示.要么来自_source字段,要么是一个存储字段.
_all字段不在_source字段中,默认情况下不存储.所以不能用于高亮显示.有两个选项:要么存储_all字段,要么高亮原始字段.

存储_all字段

如果store设置为true,则可以取出_all原始字段并高亮显示.

PUT myindex
{
  "mappings": {
    "mytype": {
      "_all": {
        "store": true
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET _search
{
  "query": {
    "match": {
      "_all": "John Smith"
    }
  },
  "highlight": {
    "fields": {
      "_all": {}
    }
  }
}

当然,存储_all字段将会占用更多的磁盘空间.因为它是其他字段的组合,所以可能会导致奇怪的高亮结果.
_all字段也接受term_vector和index_options参数,允许使用fast vector highlighter和postings highlighter.

高亮原始字段

你可以查询_all字段,但是使用原始字段高亮:

PUT myindex
{
  "mappings": {
    "mytype": {
      "_all": {}
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET _search
{
  "query": {
    "match": {
      "_all": "John Smith"                                                                      (1)
    }
  },
  "highlight": {
    "fields": {
      "*_name": {                                                                               (2)
        "require_field_match": "false"                                                          (3)
      }
    }
  }
}

(1) 查询检查_all字段找到匹配的文档
(2) 高亮是在两个name字段上执行的,它们可以从_source字段获取
(3) 查询没有针对name字段进行,所以将require_field_match设置为false.

官网 : https://www.elastic.co/guide/en/elasticsearch/reference/2.4/mapping-all-field.html#highlighting-all-field

相关标签: big data