Elasticsearch中text与keyword的区别

ES更新到5版本后,取消了 string 数据类型,代替它的是 keyword 和 text 数据类型.那么 text 和keyword有什么区别呢?

添加数据

使用bulk往es数据库中批量添加一些document

1
2
3
4
5
6
7
8
9
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"}

查看mapping

发现name、author的type是text,
还有个field是keyword,keyword的type是keyword:

查询

使用term查询某个小说:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}

结果是什么也没有查到:

然后使用name的keyword查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name.keyword": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}

可以查询到一条数据:

实验

使用name不能查到,而使用name.keyword可以查到,我们可以通过下面的实验来判断:

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

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

结论

text类型:会分词,先把对象进行分词处理,然后再再存入到es中。
当使用多个单词进行查询的时候,当然查不到已经分词过的内容!

keyword:不分词,没有把es中的对象进行分词处理,而是存入了整个对象!
这时候当然可以进行完整地查询!默认是256个字符!

作者:香山上的麻雀
链接:https://www.jianshu.com/p/1189ff372c38
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

-------------本文结束 感谢您的阅读-------------
如果觉得我的文章对您有用,请随意打赏.您的支持将鼓励我继续创作!

  • 本文标题: Elasticsearch中text与keyword的区别
  • 文章作者: 永夜初晗凝碧天
  • 发布时间: 2020年01月10日 - 17:01:79
  • 更新时间: 2020年01月10日 - 17:01:11
  • 本文链接: https://yongnights.github.io/2020/01/10/Elasticsearch中text与keyword的区别/
  • 版权声明: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。