当摆弄索引里面的数据时,我们发现一些奇怪的事情。一些事情看起来被打乱了:在我们的索引中有12条推文,其中只有一条包含日期2014-09-15,但是看一看下面查询命中的总数(total):

    1. GET /_search?q=2014 # 12 results
    2. GET /_search?q=2014-09-15 # 12 results !
    3. GET /_search?q=date:2014-09-15 # 1 result
    4. GET /_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 字段)的字段和代表全文的字段。这个区别非常重要——他将搜索引擎和所有其他数据库区别开来。