ElasticSearch-映射与分析

当你经常进行搜索操作时,会发现一些奇怪的事情。例如,我现在ElasticSearch中的csdn索引、blog类型中有这么一条数据:

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 20,
    "successful" : 20,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "csdn",
        "_type" : "blog",
        "_id" : "124",
        "_score" : 1.0,
        "_source" : {
          "date" : "2017-10-19"
        }
      }
    ]
  }
}

接下来我们分别进行如下搜索:

. curl -XGET 'http://localhost:9200/csdn/blog/_search?q=2017'. curl -XGET 'http://localhost:9200/csdn/blog/_search?q=date:2017-10-19'. curl -XGET 'http://localhost:9200/csdn/blog/_search?q=date:2017'

搜出结果:

①. 搜出1个文档
②. 搜出1个文档
③. 搜出0个文档

1号搜索为搜索全文,因为date字段中包含了2017,所以搜索出1个结果,2号搜索在date字段中进行匹配,从数据中可以看出,所以匹配到1个的结果也是毫无问题的。再来看3号搜索,从数据可以看出,date字段是包含2017的,可是为何搜索却未匹配到任何文档?

这是因为ElasticSearch动态的为我们产生了映射,告诉我们date字段是date类型,那到底是不是这样呢,我们可以通过如下请求查看字段映射后的类型:

# 查询csdn索引,blog类型的映射
curl -XGET 'http://localhost:9200/csdn/_mapping/blog'

返回结果如下:

{
  "csdn" : {
    "mappings" : {
      "blog" : {
        "properties" : {
          "date" : { "type" : "date" } }
      }
    }
  }
}

从数据可以看出ElasticSearch动态字段做了一个映射,告诉我们date字段是date类型的,因为date类型和text索引方式不同,所以搜索的结果自然也就不一样。因为_all是默认字段,所以没有提及它。但是我们知道_all字段是 text类型的。你可能会认为核心数据textintegerdateboolean等类型的索引方式会有稍许不同。没错,它们的确有一些不同。到目前为止最大的差异在于代表精确值的字段和代表全文的字段

精确值与全文

ElasticSearch的数据可以概括的分为两类:精确值全文

精确值顾名思义,匹配规则要求非常严格。例如日期与ID,但有些字符串也可以表示精确值,例如身份证号码以及邮箱地址等。对于精确值来讲,helloHello是不同的,20172017-10-25是不同的。

另一方面,全文是指文本数据,例如一篇博客的内容或者一封邮件的内容等。

精确值很容易查询,一些常用的SQL就能表示:

select * from table where name = "laowang"
select * from table where age = 18

全文类型的搜索有点类似于我们常用的模糊查询,却又与模糊查询大不一样:

  • 搜索“江南”,将会匹配到“江西”,“江苏”,“南宁”,“南昌”等

映射

为了能够将时间视为时间,数字域视为数字,字符串域视为全文或者精确值字符串,Elasticsearch需要知道每个域中数据的类型,这些数据包含在映射中。

索引中每个文档都有类型,每种类型都有它自己的映射,或者模式定义。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也配置与类型相关的元数据。

当前索引一个包含新域的文档–之前未曾出现过–Elasticsearch会使用动态映射,通过JSON数据类型,尝试猜测域类型,使用如下规则:

JSON类型域类型
布尔型:true或者falseboolean
整数:123long
浮点型:12.3double
有效日期:2017-10-29date
字符串:elasticsearchtext
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值