虽然原文名称是fields
,单主要是描述multi-fields
fields(字段)
我们经常会因为不同的目的将同一个字段用不同的方式索引。这就相当于实现了 multi-fields
。例如,一个 string
类型字段可以被映射成 text
字段作为 full-text
进行搜索,同时也可以作为 keyword
字段用于排序和聚合:
为了解释上面的原文,我先举个自己的例子,这样对比就更容易理解了:
利用PUT命令创建document时自动创建索引
PUT my_index/_doc/1
{
"city": "New York"
}
我们通过 GET my_index/_mapping/_doc/
查看下此时mapping:
{
"my_index": {
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text", //供full text全文查询
"fields": {
"keyword": { //供排序和聚合,默认值为keyword
"type": "keyword",
"ignore_above": 256
}
}
下面,再来看官方例子:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text", //供full text全文查询
"fields": {
"raw": { //用户显示指定的字段raw,如果不指定,默认值为keyword
"type": "keyword" //供 keyword全词查询
}
}
}
}
}
}
}
PUT my_index/_doc/1
{
"city": "New York"
}
PUT my_index/_doc/2
{
"city": "York"
}
GET my_index/_search
{
"query": {
"match": {
"city": "york" //full text search
}
},
"sort": {
"city.raw": "asc" //用作排序
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw" //用作聚合查询
}
}
}
}
备注 Multi_fields 不会改变原始的 _source 字段。
注意同一索引相同字段名可以设置不同的 fields。可以通过PUT mapping API 在已经存在的字段加入新的 multi-fields
Multi-fields with multiple analyzers(多分析器处理多字段)
multi-fields
的另一种使用情况是同一字段使用不同的解析方式,使其能更好的检索。例如,我们可以用标准分析器对字段进行索引,它将文本分解为单词,再用英文分析器将单词分成词根:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"text": { //text 字段使用标准分析器
"type": "text",
"fields": {
"english": { // text.english 字段使用英文分析器
"type": "text",
"analyzer": "english"
}
}
}
}
}
}
}
PUT my_index/_doc/1
{ "text": "quick brown fox" } //索引文档,使用 fox
PUT my_index/_doc/2
{ "text": "quick brown foxes" } //索引文档,使用 foxes
GET my_index/_search
{
"query": {
"multi_match": {
"query": "quick brown foxes",
"fields": [ //同时搜索 text 和 text.english 字段,并合并其评分
"text",
"text.english"
],
"type": "most_fields" //同时搜索 text 和 text.english 字段,并合并其评分
}
}
}
text 字段在第一个文档中包含词根 fox,在第二个文档中包含词根 foxes。text.english 字段在两个文档同时包含词根 fox,因为 foxes 是 fox 的衍生词。
字符串搜索会为 text 字段使用标准分析器解析,为 text.english 字段使用英文分析器解析。衍生字段将会使搜索 foxes 的同时匹配到 fox。这使我们能尽可能多的匹配到文档。同时,搜索没有衍生的 text 字段时,我们会在文档精确匹配 foxes 的时候提高其检索评分。