关于elasticsearch的mapping简介
2017-02-24 11:40
288 查看
最近在玩elk,发现许多不了解的东西,虽然网上资料很多,但基本都乱且杂,通俗易懂的资料就显得尤为珍贵。
网上发现这篇文章不错,以通俗易懂的语言讲明白了mapping的概念。
默认mapping
Elasticsearch(简称ES)是一个schema-less的系统,但并不代表no shema,当我们执行以下命令:
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字段的转换过程:
看看以单词a来搜索的结果:
转自http://blog.csdn.net/lvhong84/article/details/23936697
里面貌似是es1.x或2.x版本,内容稍有修改:
1、说是A会被过滤掉,且查询时无法查出
2、查询时用的字段为 text,而不是 term
网上发现这篇文章不错,以通俗易懂的语言讲明白了mapping的概念。
默认mapping
Elasticsearch(简称ES)是一个schema-less的系统,但并不代表no shema,当我们执行以下命令:
curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"zach", "description": "A Pretty cool guy."}'ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping。
curl -XPUT 'http://localhost:9200/test/_mapping' mappings: { item: { properties: { description: { type: text } name: { type: text } } } }什么是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" : "a", "start_offset" : 0, "end_offset" : 1, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "pretty", "start_offset" : 2, "end_offset" : 8, "type" : "<ALPHANUM>", "position" : 1 }, { "token" : "cool", "start_offset" : 9, "end_offset" : 13, "type" : "<ALPHANUM>", "position" : 2 }, { "token" : "guy", "start_offset" : 14, "end_offset" : 17, "type" : "<ALPHANUM>", "position" : 3 } ] }可以看到, 我们的description字段的值转换成了[a],[pretty], [cool], [guy], 在转换过程中‘标点符号’都被filter过滤掉了, A、Pretty也转成了全小写的a、pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这四个单词了, 其他的都是抛弃掉了。
看看以单词a来搜索的结果:
curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{ "query" : { "term" : { "description": "a" } } }' { "took" : 14, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.2876821, "hits" : [ { "_index" : "test", "_type" : "item", "_id" : "1", "_score" : 0.2876821, "_source" : { "name" : "zach", "description" : "A Pretty cool guy." } } ] } }这是一个公认的简单例子, 但是它描述了ES是如何工作的, 不要把mapping想成是数据类型, 把它想象成是搜索数据的指令集合。
转自http://blog.csdn.net/lvhong84/article/details/23936697
里面貌似是es1.x或2.x版本,内容稍有修改:
1、说是A会被过滤掉,且查询时无法查出
2、查询时用的字段为 text,而不是 term
相关文章推荐
- elasticsearch中的mapping简介
- elasticsearch中的mapping简介
- elasticsearch中的mapping简介
- elasticsearch中的mapping简介
- elasticsearch中的mapping简介
- elasticsearch中的mapping简介
- 关于Eclipse 3.0的插件自动构建简介
- 关于SQL Server中索引使用及维护简介
- 关于.NET动态代理的介绍和应用简介
- 使用PowerDesigner 的Hibernate O/R Mapping功能简介
- 一点关于Qt的简介
- 关于SQL Server中索引使用及维护简介
- 使用PowerDesigner 的Hibernate O/R Mapping功能简介
- 关于802.11协议族简介总结整理
- 关于IBM数据库DB2 9的九大特性简介(1)
- 有关于NBear的简介
- 关于net.sf.hibernate.MappingException: Unknown entity class的问题
- 关于.NET动态代理的介绍和应用简介
- 关于SQL Server中索引使用及维护简介
- 关于service层、dao层,以及O/R Mapping之间的思考