设为首页 加入收藏

TOP

〈四〉ElasticSearch的认识:基础原理的补充(六)
2019-10-09 19:58:37 】 浏览:112
Tags:ElasticSearch 认识 基础 原理 补充
s": { "height":{ "type": "float" } } }




查看mapping

1.之前说过了,可以通过查看索引来查看mapping:GET /index,例如GET /test0103/_mapping
2.通过GET /index/_mapping,例子:GET /test0103/_mapping
3.你也可以附加type来查看指定type包裹的mapping。GET /test0103/_mapping/person




keyword

上面定义mapping的时候有定义一个keyword,这是什么?有什么用?
ElasticSearch对于一些类型的字段,例如text类型的字段,默认是会进行分词的。但如果我们并不想分词呢?一些数据我们想要非常精确地查找,并且只找到我们搜索的数据的时候,这个字段是不应该分词的。那么我们可以使用keyword来存储完整的原有的数据,keyword会作为一个索引词,然后我们针对字段.keyword来搜索。【例子上面已经举例了】

理论上,这个不分词的字段的数据应该是比较简短的,太长的话可能就没有必要不分词了。所以在定义keyword的时候还可以提供"ignore_above": 数值来限制超过多少个字符就不使用原有数据创建keyword.
现在版本中,对于默认分词的字段,现在会默认附加一个keyword。




mapping对分词的影响

1.数据类型的影响:

以date和text类型存储的“日期”类型的数据的分词差异化为例:
date和string这两者都是使用双引号包裹的,与其他数值型的不分词的数据类型不一样。所以以他们两个为例。

PUT /test0104
{
  "settings": {
    "index":{
      "number_of_shards":3,
            "number_of_replicas":1
    }
  },
  "mappings": {
    "test":{
      "properties": {
        "post_date":{
          "type": "text"
        },
        "birthdate":{
          "type":"date"
        }
      }
    }
  }
}
PUT /test0104/test/1
{
  "post_date":"2019-09-30",
  "birthdate":"2018-08-29"
}
PUT /test0104/test/2
{
  "post_date":"2018-09-30",
  "birthdate":"2017-08-29"
}
PUT /test0104/test/3
{
  "post_date":"2017-09-30",
  "birthdate":"2016-08-29"
}

//测试1:结果是ID:1
GET /test0104/test/_search
{
  "query": {
    "match": {
      "post_date": "2019"
    }
  }
}
// 测试2:结果是ID=1,2,3的文档,理论上text存储的日期格式的没有分词区别
GET /test0104/test/_search
{
  "query": {
    "match": {
      "post_date": "30"
    }
  }
}

//测试3:结果无,【单搜索08或2017,2018,2016也是无,】
GET /test0104/test/_search
{
  "query": {
    "match": {
      "birthdate": "29"
    }
  }
}
//测试4, 结果是ID=2的文档
GET /test0104/test/_search
{
  "query": {
    "match": {
      "birthdate": "2017-08-29"
    }
  }
}

2.不索引的影响:
不索引的时候不会进行分词,甚至不能用于搜索。【低版本对于properties中的index设置不一样,5.x以下是不分词,5.x以上是不索引,不索引就不可以用于搜索】
3.keyword的影响:
keyword适用于不分词的搜索的情况,在keyword中的数据不会分词。
4.其他:
mapping还可以设置分词器来使用不同的分词器来分词。

// 你可以使用格式类似如下的代码来测试mapping中某个字段的分词结果,如果是不允许分词的,则会报Analysis requests are only supported on tokenized fields错误。
GET /test0104/_analyze
{
  "field": "post_date",
  "text": "2017-09-30" 
}




补充:

  • dynamic mapping策略是关于自动创建mapping的策略,定义了遇上某某数据的时候把它当作什么类型,比如可以定义存入"2017-09-30"的时候认为是text而不是date,这些内容可能会留到后面再讲,也有可能后面再补充到这里。
  • 复合数据类型比较特殊,可能会留到后面再讲,也有可能后面再补充到这里。




小节总结:

本节介绍了什么是mapping,mapping负责管理索引的数据结构和字段的分词等一些配置。在直接存储数据的时候,会dynamic mapping;然后介绍了如何创建mapping,如何修改mapping,如何查看mapping;然后介绍了keyword这个保留原数据的一个特殊的字段。





相关度分数

相关度分数的具体算法我们其实并不需要关心。但可能还是需要大概了解一下计算的方式。

为什么说不需要关心呢?因为实际上相关度是由索引词直接决定的,分析好哪些是用于搜索的词就可以大致分析出相关度排序了。
当然,这只是大概的,因为内部可能因为索引词的重复性问题会降低某个词的score,但差距一般不会太大。

  • 在我们进行搜索的时候,你可以看到一个score,这个就是相关度分数,在默认排序中相关度分数最高的会被排在最前面,这个分数是ElasticSearch根据你搜索的内容,使用内部算法计算出的一个数值。
  • 内部算法主要是指TF算法和IDF算法。




TF算法

TF算法,全称Term frequency,索引词频率算法。

首页 上一页 3 4 5 6 7 8 下一页 尾页 6/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【干货总结】:可能是史上最全的My.. 下一篇数据库系统(二)--关系型数据库..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目