Elasticsearch系列——实战探索text与keyword的区别
原创前方一片光明 最后发布于2018-08-22 17:36:07 阅读数 8809 收藏
展开
前言
本文使用的工具是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"}
step2 查看mapping
查看一下mapping
发现name、author的type是text,
还有个field是keyword,keyword的type是keyword:
step3 查询
我们使用term查询某个小说:
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}
结果是什么也没有查到:
然后使用name的keyword查询:
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name.keyword": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}
可以查询到一条数据:
step4 实验
使用name不能查到,而使用name.keyword可以查到,很奇怪呢!
WHY ?
我们可以通过下面的实验来判断:
使用name进行分词的时候,结果会有4个词出来:
使用name.keyword进行分词的时候,结果只有一个词出来:
结论
1. text类型:会分词,先把对象进行分词处理,然后再再存入到es中。
当使用多个单词进行查询的时候,当然查不到已经分词过的内容!
2. keyword:不分词,没有把es中的对象进行分词处理,而是存入了整个对象!
这时候当然可以进行完整地查询!默认是256个字符!
OK, GAME OVER!
————————————————
版权声明:本文为CSDN博主「前方一片光明」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26230421/article/details/81947517