ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,
string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。


ElasticSearch字符串将默认被同时映射成text和keyword类型,将会自动创建下面的动态映射。
通过 GET /dist_test/_mapping/field/weixin_number 命令查看 weixin_number 字段数据类型,可以看到 mapping 下除了 text 还有 keyword。两者有什么区别呢?
- {
- "dist_test" : {
- "mappings" : {
- "weixin" : {
- "weixin_number" : {
- "full_name" : "weixin_number",
- "mapping" : {
- "weixin_number" : {
- "type" : "text",
- "fields" : {
- "keyword" : {
- "type" : "keyword",
- "ignore_above" : 256
- }
- }
- }
- }
- }
- }
- }
- }
- }
- GET /dist_test/_analyze
- {
- "field": "weixin_number",
- "text": "vicky1176320626"
- }
- GET /dist_test/_analyze
- {
- "field": "weixin_number",
- "text": "XP3412"
- }
- GET /dist_test/_analyze
- {
- "field": "weixin_number",
- "text": "AAAA-95533"
- }
这也是某些情况下,term 查询后查询不到数据的原因。解决方案也很简单,使用 keyword 精确查询即可。
如例:针对Text类型的数据,要使用term查询
- {
- "from": 0,
- "size": 10,
- "query": {
- "bool": {
- "must": [
- {
- "term": {
- "city.keyword": {
- "value": "湖南省长沙市",
- "boost": 1
- }
- }
- }
- ],
- "adjust_pure_negative": true,
- "boost": 1
- }
- }
- }