当摆弄索引里面的数据时,我们发现一些奇怪的事情。一些事情看起来被打乱了:在我们的索引中有12条推文,其中只有一条包含日期2014-09-15,但是看一看下面查询命中的总数(total):
GET /_search?q=2014 # 12 resultsGET /_search?q=2014-09-15 # 12 results !GET /_search?q=date:2014-09-15 # 1 resultGET /_search?q=date:2014
为什么在 _all字段查询日期返回所有推文,而在date字段只查询年份却没有返回结果?为什么我们这在 _all字段和 date字段的查询结果有差别?
推测起来,这是因为数据在 _all 字段与 date 字段的索引方式不同。所以,通过请求gb 索引中tweet 类型的映射(或模式定义),让我们看一看Elasticsearch 是如何解释我们文档结构的:
GET /gb/_mapping/tweet
这将得到如下结果:
{
"gb": {
"mappings": {
"tweet": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"name": {
"type": "string"
},
"tweet": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
}
}
}
基于对字段类型的猜测,Elasticsearch动态为我们产生了一个映射.这个响应告诉我们date字段被认为是date 类型的.由于_all是默认字段,所以没有提及他。但是我们知道_all字段是string类型的。
所以date 字段和 string 字段索引方式不同,因此搜索结果也不一样。这完全不令人吃惊。你可能会认为核心数据类型strings、numbers、Booleans和dates的索引方式有稍许不同。没错,他们确实稍有不同。
但是,到目前为止,最大的差异在于代表精确值(它包括string 字段)的字段和代表全文的字段。这个区别非常重要——他将搜索引擎和所有其他数据库区别开来。
