映射和分析(mapping and analysis)
当在index中操作数据的时候,我们会发现一些奇怪的现象,一些现象会打破我们原有的预想:现在在index中有12个tweets,只有其中的一个tweets包含了2014-09-15这个日期,但是看看下面查询语句的返回中total:
GET /_search?q=2014 #12 results
GET /_search?q=2014-09-15 #12 results !
GET /_search?q=date:2014-09-15 #1 result
GET /_search?q=date:2014 #0 results !
对_all字段进行查询的时候就返回所有的tweets,对_date字段进行查询年份的时候就没有结果返回,这个是什么原因呢?在_all或date字段搜索结果为什么不一样呢?
想必这个是因为数据在_all字段中存储和在date字段中存储的方式是不一样的。现在看一下,ES对document结构是怎么解析的,在gb这个index中对tweet请求mapipng:
GET /gb/_mapping/tweet
返回结果如下:
{
"gb":{
"mappings":{
"tweet":{
"properties":{
"date":{
"type":"date",
"format":"dateOptionalTime"
},
"name":{
"type":"string"
},
"tweet":{
"type":"string"
},
"user_id":{
"type":"long"
}
}
}
}
}
}
ES已经为我们自动生成一个mapping,根据这个mapping,ES能猜测字段的类型。响应的消息显示date字段被认为是一个date类型。_all字段这里没有提到,因为他是一个默认的字段,并且我们知道_all的类型是string。
因此,date类型的field和string类型的field的存储是不同的,才导致搜索结果的不同。这个不值得大惊小怪,你也许会想要精确的指定每个字段的类型——string,numbers,booleans,dates——这些在存储的时候都有略微的不同。
目前最大的不同是字段精确值之间的呈现方式和full text呈现方式。这个不同是非常重要的,这个就是搜索引擎和其他数据库不同之处。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-analysis.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。