analyzer
对于 analyzed
字符串域,用 analyzer
属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard
分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace
、 simple
和 english
:
{
"tweet": {
"type": "text",
"analyzer": "english"
}
}
更新映射
当你首次创建一个索引的时候,可以指定类型的映射。你也可以使用 /_mapping
为新类型(或者为存在的类型更新映射)增加映射。
Note:
尽管你可以 增加 一个存在的映射,你不能 修改 存在的域映射。如果一个域的映射已经存在,那么该域的数据可能已经被索引。如果你意图修改这个域的映射,索引的数据可能会出错,不能被正常的搜索。
我们可以更新一个映射来添加一个新域,但不能将一个存在的域从 analyzed
改为 not_analyzed
。
为了描述指定映射的两种方式,我们先删除 gd
索引:
DELETE /gb
然后创建一个新索引,指定 tweet
域使用 english
分析器:
PUT /gb
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "text",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "text"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
稍后,我们决定在 tweet
映射增加一个新的名为 tag
的 not_analyzed
的文本域,6.5版本中index 变成了boolean类型,使用 _mapping
:
PUT /gb/_mapping/tweet
{
"properties": {
"tag":{
"type": "text",
"index": true
}
}
}
注意:我们不需要再次列出所有已存在的域,因为无论如何我们都无法改变它们。新域已经被合并到存在的映射中。
查看mapping是否成功设置
GET /gb/_mapping
测试映射
你可以使用 analyze
API 测试字符串域的映射。比较下面两个请求的输出:
测试一 测试分析器类型为english 的field
GET /gb/_analyze
{
"field": "tweet",
"text": ["Black-cats"]
}
测试二 测试没有使用默认分析器standard的field tag
GET /gb/_analyze
{
"field": "tag",
"text": ["Black-cats"]
}
结果:tweet
域产生两个词条 black
和 cat
, tag
域产生两个词条 black和cats
。换句话说,我们的映射正常工作。