elasticsearch 学习博客系列<二> ES 中 index 设置 Mapping(表结构)

通过上一篇 我们了解到ES中的一些概念,回顾一下:

几个基本名词

index: es里的index相当于一个数据库。 
type: 相当于数据库里的一个表。 
id: 唯一,相当于主键。 
node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同。 
cluster:代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。 
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

下面我们说一下  表的结构 映射 mapping

默认mapping

elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令:

curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"zach", "description": "A Pretty cool guy."}


ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping。

mappings: {  
    item: {  
        properties: {  
            description: {  
                type: string  
            }  
            name: {  
                type: string  
            }  
        }  
    }  
}  


什么是mapping

ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。

同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。


剖析mapping

一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。

filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。

一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。

总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。


默认analyzer

回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。

我们可以在做查询的时候键入_analyze关键字查看分析的过程。使用以下指令查看description字段的转换过程:

curl -X GET "http://localhost:9200/test/_analyze?analyzer=standard&pretty=true" -d "A Pretty cool guy."  
   
{  
  "tokens" : [ {  
    "token" : "pretty",  
    "start_offset" : 2,  
    "end_offset" : 8,  
    "type" : "<ALPHANUM>",  
    "position" : 2  
  }, {  
    "token" : "cool",  
    "start_offset" : 9,  
    "end_offset" : 13,  
    "type" : "<ALPHANUM>",  
    "position" : 3  
  }, {  
    "token" : "guy",  
    "start_offset" : 14,  
    "end_offset" : 17,  
    "type" : "<ALPHANUM>",  
    "position" : 4  
  } ]  



可以看到, 我们的description字段的值转换成了[pretty], [cool], [guy], 在转换过程中大写的A, 标点符号都被filter过滤掉了, Pretty也转成了全小写的pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这三个单词了, 其他的都是抛弃掉了。

看看以单词a来搜索的结果:

$ curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{  
    "query" : {  
        "text" : { "description": "a" }  
    }  
}'  
   
{  
  "took" : 29,  
  "timed_out" : false,  
  "_shards" : {  
    "total" : 5,  
    "successful" : 5,  
    "failed" : 0  
  },  
  "hits" : {  
    "total" : 0,  
    "max_score" : null,  
    "hits" : [ ]  
  }  
}  


text类型的搜索在查询过程中使用了和之前插入数据相同的分析/过滤系统, 所以我们输入"a",mapping不会有任何返回, 因为单词“a”不会被ES存储和索引。反过来,如果我们使用单词"cool"进行搜索:

curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{  
    "query" : {  
        "text" : { "description": "cool" }  
    }  
}'  
   
{  
  "took" : 29,  
  "timed_out" : false,  
  "_shards" : {  
    "total" : 5,  
    "successful" : 5,  
    "failed" : 0  
  },  
  "hits" : {  
    "total" : 1,  
    "max_score" : 0.15342641,  
    "hits" : [ {  
      "_index" : "test",  
      "_type" : "item",  
      "_id" : "1",  
      "_score" : 0.15342641, "_source" : {"name":"zach", "description": "A pretty cool guy"}  
    } ]  
  }  
}  


上面说到的是 默认 mapping,那么我们怎么建立 自己的 mapping 呢?

比如 botnet.json(botnet 的 mapping 文件)

文件 放在 config/templates/ 下

目录 位于  D:\soft\work\DB\elasticsearch-1.7.0\elasticsearch-1.7.0\config\templates\botnet.json


{
    "template-botnet": {
        "template": "botnet*",
        "settings": {
            "index.number_of_shards": 12,// 分片数
            "number_of_replicas": 1,// 副本数
            "index": {
                "store": {
                    "compress": {
                        "stored": true,
                        "tv": true
                    }
                }
            }
        },
        "mappings": {
            "botnet": {
                "_source": {
                    "compress": true
                },
                "_all": {
                    "enabled": false
                },
                "properties": {
                    "lid": {
                        "type": "long",
                        "index": "not_analyzed"// 聚合 字段 不可分词
                    },
		    "url": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "ip": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "ipLong": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "port": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "source": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "state": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "type": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "firstCreateTime": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "createTime": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "updateTime": {
			  "type": "long",
			  "fielddata": {
			     "format": "doc_values"
			  }
		    },
		    "bigArea": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "smallArea": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "geoX": {
		      "type": "double",
		      "fielddata": {
		        "format": "doc_values"
		      }
		    },
		    "geoY": {
		      "type": "double",
		      "fielddata": {
		        "format": "doc_values"
		      }
		    },
		    "note": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "action": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "prot": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "reliability": {
			"type": "long",
			 "fielddata": {
			    "format": "doc_values"
			 }
	            },
		    "isLive": {
			"type": "long",
			 "fielddata": {
			    "format": "doc_values"
			 }
	            },
		    "system": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            },
		    "port": {
			"type": "long",
			 "fielddata": {
			    "format": "doc_values"
			 }
	            },
		    "countryCode": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            }
                }
            }
        }
    }
}


说明:1.建立 mapping 的 规则是   将要 聚合的field 不可分词 ,设置成 

"bigArea": {
			"type": "string",
			 "fielddata": {
			     "format": "doc_values"
			  },
		          "index": "not_analyzed"
	            }


 2.预留出 空余字段 ,因为 索引的结构一旦 设置成 存上数据,就不可改变 (不像mysql 等),所以 在  设计的时候 就应该  预留出 扩展字段  String  long  型的 都要 流出余地来。
mapping相当于 在关系型 的ddl 建表语言   :

CREATE TABLE `workers_info` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `workername` varchar(20) NOT NULL,  
  `sex` enum(F,M,S),  
  `salary` int(11) DEFAULT '0',  
  `email`  varchar(30),  
  `EmployedDates`  date,  
  `department`  varchar(30),  
  PRIMARY KEY (`id`)  
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;  

不足之处 请指正!
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESElasticsearch)是一个分布式的搜索和分析引擎,常用于构建全文搜索引擎、日志分析、数据分析等场景。下面是index、type和mappingES的作用: 1. Index索引):在ESindex是存储和索引文档的地方。每个index可以包含多个type,类似于关系型数据库一个index通常代一种数据类型或者数据集合。 例如,一个名为“products”的index可以用于存储产品数据,另一个名为“users”的index可以用于存储用户数据。 2. Type(类型):在ES,type是index文档的逻辑分类,类似于关系型数据库的类型。每个type包含一个或多个文档(document),每个文档有自己的字段(field)。不同的type可以共享相同的mapping,也可以拥有自己独有的mapping。 例如,在“products”索引,可以定义两个不同的type:“book”和“movie”。每个type都有自己的字段,例如“book”type可能有字段“title”、“author”、“publisher”,而“movie”type可能有字段“title”、“director”、“year”。 3. Mapping(映射):在ESmapping用于定义文档的字段和属性。每个index的每个type都有自己的mappingmapping定义了字段的类型、是否需要索引、是否存储等信息。 例如,在“products”索引,对于“book”type,可以定义字段“title”为“text”类型,需要索引,但不需要存储。对于“author”字段,可以定义为“keyword”类型,需要索引并且需要存储。这些mapping定义了文档的结构和特征,可以支持高效的搜索和聚合操作。 总之,index、type和mappingES非常重要的概念,可以帮助我们组织和管理数据,并实现高效的搜索和分析。 ### 回答2: 在ElasticsearchESindex、type和mapping都是用来组织和管理存储在集群的数据的重要概念。 1. Index索引):索引ES最基本的概念之一,代一个逻辑上的数据存储容器。它类似于传统数据库的数据库,用于将数据进行组织和分割。每个索引都有一个唯一的名称,用于标识和访问其存储的数据。一个ES集群可以包含多个索引,每个索引可以包含多个文档和其相关信息。 2. Type(类型):类型是指索引内的逻辑分组,用于将索引内的文档进一步分类。一个索引可以包含多个类型,每个类型通常示一种相似的数据。例如,在一个名为"blog"的索引,可以有类型"post"和"type",分别用于存储博客文章和评论。类型不再是ES7.x及以后版本的概念,ES7.x及以后的版本将使用单个索引来存储数据。 3. Mapping(映射):映射是用来定义索引的数据结构和类型的方式。它类似于传统数据库结构,通过映射可以指定字段的类型、分析器、是否索引、是否存储等属性。映射将数据的结构定义为类型、字段和属性的集合,用于确定数据如何被存储和搜索。在索引创建之前,通过映射可以提前规划好数据的结构,以便进行更有效的搜索和聚合操作。 综上所述,index、type和mappingES扮演着重要的角色。索引用于组织和分割数据,类型用于进一步分类和组织索引内的数据,映射用于定义和控制数据的结构和属性。它们共同促使ES成为一个强大的搜索和分析引擎,能够处理和查询大规模的分布式数据。 ### 回答3: 在ElasticsearchESindex、type和mapping都是非常重要的概念。 首先,indexES用于存储、组织和检索文档的单元。它类似于关系数据库的数据库。每个index都有一个唯一的名称,我们可以在一个ES集群创建多个index来存储不同类型的数据。index的文档被分配到不同的分片,以便实现高可用性和扩展性。 其次,type是index的逻辑分类或分组。同一个index的文档可以被分为不同的type,以便更好地组织数据。type是可选的,可以灵活地定义,用于根据业务需求创建不同类型的文档结构。然而,在ES 7.0版本之后,type已经被弃用,建议直接使用index来组织数据。 最后,mapping是定义index文档结构和字段的方式。mapping描述了index的每个字段的数据类型、分词器和其他属性。通过mappingES可以自动识别文档的字段并进行正确的数据解析和处理。mapping还允许我们为不同的字段添加搜索、过滤和聚合等功能。ES提供了自动创建mapping的功能,也可以手动创建和修改mapping来满足特定的业务需求。 总结来说,index用于存储、组织和检索文档,type用于在index内部进行逻辑分类,而mapping则定义了index文档的结构和字段的属性。这些都是ES关键的概念,对于有效地管理和利用数据非常重要。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值