http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6648|回复: 4

[搜索引擎] 31-Elasticsearch 映射

[复制链接]
发表于 2019-1-1 14:31:11 | 显示全部楼层 |阅读模式
为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。

如 数据输入和输出 中解释的, 索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义 。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。

我们会在 类型和映射 详细讨论映射。本节,我们只讨论足够让你入门的内容。

核心简单域类型
Elasticsearch 支持 如下简单域类型:

[C#] 纯文本查看 复制代码
字符串: string

整数 : byte, short, integer, long

浮点数: float, double

布尔型: boolean

日期: date

当你索引一个包含新域的文档--之前未曾出现-- Elasticsearch 会使用 动态映射 ,通过JSON中基本数据类型,尝试猜测域类型,使用如下规则:

[C#] 纯文本查看 复制代码
JSON type



域 type



布尔型: true 或者 false



boolean



整数: 123



long



浮点数: 123.45



double



字符串,有效日期: 2014-09-15



date



字符串: foo bar



string


注意
这意味着如果你通过引号( "123" )索引一个数字,它会被映射为 string 类型,而不是 long 。但是,如果这个域已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long ,如果无法转化,则抛出一个异常。

查看映射
通过 /_mapping ,我们可以查看 Elasticsearch 在一个或多个索引中的一个或多个类型的映射 。在 开始章节 ,我们已经取得索引 gb 中类型 tweet 的映射:

[C#] 纯文本查看 复制代码
GET /gb/_mapping/tweet

Elasticsearch 根据我们索引的文档,为域(称为 属性 )动态生成的映射。

[C#] 纯文本查看 复制代码
{

   "gb": {

      "mappings": {

         "tweet": {

            "properties": {

               "date": {

                  "type": "date",

                  "format": "strict_date_optional_time||epoch_millis"

               },

               "name": {

                  "type": "string"

               },

               "tweet": {

                  "type": "string"

               },

               "user_id": {

                  "type": "long"

               }

            }

         }

      }

   }

}

提示
错误的映射,例如 将 age 域映射为 string 类型,而不是 integer ,会导致查询出现令人困惑的结果。

检查一下!而不是假设你的映射是正确的。

自定义域映射
尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域。自定义映射允许你执行下面的操作:

全文字符串域和精确值字符串域的区别
使用特定语言分析器
优化域以适应部分匹配
指定自定义数据格式
还有更多
域最重要的属性是 type 。对于不是 string 的域,你一般只需要设置 type :

[C#] 纯文本查看 复制代码
{

    "number_of_clicks": {

        "type": "integer"

    }

}

默认, string 类型域会被认为包含全文。就是说,它们的值在索引前,会通过 一个分析器,针对于这个域的查询在搜索前也会经过一个分析器。

string 域映射的两个最重要 属性是 index 和 analyzer 。

index
index 属性控制怎样索引字符串。它可以是下面三个值:

analyzed
首先分析字符串,然后索引它。换句话说,以全文索引这个域。
not_analyzed
  索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
no
不索引这个域。这个域不会被搜索到。
string 域 index 属性默认是 analyzed 。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed :

[C#] 纯文本查看 复制代码
{

    "tag": {

        "type":     "string",

        "index":    "not_analyzed"

    }

}

注意
其他简单类型(例如 long , double , date 等)也接受 index 参数,但有意义的值只有 no 和 not_analyzed , 因为它们永远不会被分析。

analyzer
对于 analyzed 字符串域,用 analyzer 属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 和 `english`:

[C#] 纯文本查看 复制代码
{

    "tweet": {

        "type":     "string",

        "analyzer": "english"

    }

}

在 自定义分析器 ,我们会展示怎样定义和使用自定义分析器。

更新映射
当你首次 创建一个索引的时候,可以指定类型的映射。你也可以使用 /_mapping 为新类型(或者为存在的类型更新映射)增加映射。

注意
尽管你可以 增加_ 一个存在的映射,你不能 _修改 存在的域映射。如果一个域的映射已经存在,那么该域的数据可能已经被索引。如果你意图修改这个域的映射,索引的数据可能会出错,不能被正常的搜索。

我们可以更新一个映射来添加一个新域,但不能将一个存在的域从 analyzed 改为 not_analyzed 。

为了描述指定映射的两种方式,我们先删除 gd 索引:

[C#] 纯文本查看 复制代码
DELETE /gb

拷贝为 CURL在 SENSE 中查看
然后创建一个新索引,指定 tweet 域使用 english 分析器:

[C#] 纯文本查看 复制代码
PUT /gb 

{

  "mappings": {

    "tweet" : {

      "properties" : {

        "tweet" : {

          "type" :    "string",

          "analyzer": "english"

        },

        "date" : {

          "type" :   "date"

        },

        "name" : {

          "type" :   "string"

        },

        "user_id" : {

          "type" :   "long"

        }

      }

    }

  }

}

拷贝为 CURL在 SENSE 中查看


通过消息体中指定的 mappings 创建了索引。

稍后,我们决定在 tweet 映射增加一个新的名为 tag 的 not_analyzed 的文本域,使用 _mapping :

[C#] 纯文本查看 复制代码
PUT /gb/_mapping/tweet

{

  "properties" : {

    "tag" : {

      "type" :    "string",

      "index":    "not_analyzed"

    }

  }

}

拷贝为 CURL在 SENSE 中查看
注意,我们不需要再次列出所有已存在的域,因为无论如何我们都无法改变它们。新域已经被合并到存在的映射中。

测试映射
你可以使用 analyze API 测试字符串域的映射。比较下面两个请求的输出:

[C#] 纯文本查看 复制代码
GET /gb/_analyze

{

  "field": "tweet",

  "text": "Black-cats" 

}



GET /gb/_analyze

{

  "field": "tag",

  "text": "Black-cats" 

}

拷贝为 CURL在 SENSE 中查看


消息体里面传输我们想要分析的文本。

tweet 域产生两个词条 black 和 cat , tag 域产生单独的词条 Black-cats 。换句话说,我们的映射正常工作。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-1 20:37:44 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-2 14:00:47 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-2 17:48:08 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2019-1-8 13:31:57 | 显示全部楼层
我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 00:04

© 2014-2021

快速回复 返回顶部 返回列表