《Elasticsearch:权威指南》Mapping -- Mapping parameters -- fields(multi-fields)

虽然原文名称是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,在第二个文档中包含词根 foxestext.english 字段在两个文档同时包含词根 fox,因为 foxesfox 的衍生词。

字符串搜索会为 text 字段使用标准分析器解析,为 text.english 字段使用英文分析器解析。衍生字段将会使搜索 foxes 的同时匹配到 fox。这使我们能尽可能多的匹配到文档。同时,搜索没有衍生的 text 字段时,我们会在文档精确匹配 foxes 的时候提高其检索评分。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值