作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。

 

前言

本文使用的工具是kibana(Linux---Kibana的安装与测试

在 elasticsearch2.x 版本,字符串数据只有string类型

ES更新到5版本后,取消了 string 数据类型,代替它的是 keyword 和 text 数据类型

那么 text 和keyword有什么区别呢?

我们通过下面的步骤来探索一下:

step1 添加数据

首先,使用bulk往es数据库中批量添加一些document(关于bulk批量操作的命令,请参考:点我打开链接

POST /book/novel/_bulk
{"index": {"_id": 1}}
{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}
{"index": {"_id": 2}}
{"name": "Robinson Crusoe", "author": "Daniel Defoe", "date": "2018-01-02"}
{"index": {"_id": 3}}
{"name": "Pride and Prejudice", "author": "Jane Austen", "date": "2018-01-01"}
{"index": {"_id": 4}}
{"name": "Jane Eyre", "author": "Charlotte Bronte", "date": "2018-01-02"}

Elasticsearch系列——实战探索text与keyword的区别_java

step2 查看mapping

查看一下mapping

发现name、author的type是text,

还有个field是keyword,keyword的type是keyword:

Elasticsearch系列——实战探索text与keyword的区别_linux_02

step3 查询

我们使用term查询某个小说:

GET book/novel/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name": "Gone with the Wind"
        }
      },
      "boost": 1.2
    }
  }
}

结果是什么也没有查到:

Elasticsearch系列——实战探索text与keyword的区别_linux_03

然后使用name的keyword查询:

GET book/novel/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name.keyword": "Gone with the Wind"
        }
      },
      "boost": 1.2
    }
  }
}

可以查询到一条数据:

Elasticsearch系列——实战探索text与keyword的区别_linux_04

step4 实验

使用name不能查到,而使用name.keyword可以查到,很奇怪呢!

WHY ?
我们可以通过下面的实验来判断:

使用name进行分词的时候,结果会有4个词出来:

Elasticsearch系列——实战探索text与keyword的区别_linux_05

 

使用name.keyword进行分词的时候,结果只有一个词出来:

Elasticsearch系列——实战探索text与keyword的区别_java_06

 

结论

1. text类型:会分词,先把对象进行分词处理,然后再再存入到es中。

当使用多个单词进行查询的时候,当然查不到已经分词过的内容!

2. keyword:不分词,没有把es中的对象进行分词处理,而是存入了整个对象

这时候当然可以进行完整地查询!默认是256个字符!

OK, GAME OVER!

更多内容,请关注公众号:程序员高手之路

在公众号回复:es基础   即可免费获取elasticsearch视频教程(未加密)!

Elasticsearch系列——实战探索text与keyword的区别_linux_07

Elasticsearch系列——实战探索text与keyword的区别_公众号_08