映射和分析(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

映射和分析(mapping and analysis),,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。