背 景
ElasticSearch
常用的字符串类型有keyword
和text
,那keyword
支持排序但是不支持分词,而text
类型字段,ES默认分词且不会建立正排索引。即使设置"fielddata": true建立正排索引后,对该字段的排序依然有问题:ES不会以整个字段文本排序,而是选择分词后的一个字段进行排序。
而有的需求,我不但要字段支持分词,也要该字段整体能排序,而不是分词后的字段排序,如设置的标签字段tag_key,我希望别人搜索标签的时候能支持分词,同时我也希望搜出来的标签是有序的;
实 现
这种需求的做法,其实也不难,就是将tag_key
字段建立两次索引,一个索引设置为text
类型用于分词,一个索引设置为keyword
类型用于排序,具体操作如下,需求完美解决!
PUT /book
{
"settings":
{
"number_of_replicas": 3,
"number_of_shards": 1,
"max_result_window":1000000
},
"mappings":
{
"properties":
{
"id":
{
"type": "long"
},
"tag_key":
{
"type": "text",
"fields":
{
"raw":
{
"type": "keyword"
}
}
},
"tag_rank":
{
"type": "integer"
},
"tag_value":
{
"type": "text"
}
}
}
}
同理实现一个字段既要text也要keyword
如办公大楼的企业水牌,一个大楼可能包含很多企业入住,针对这些企业,我希望能在ElasticSearch时既能分词查询(需要该field的是text类型
)又能支持全词模糊匹配(即wildcard查询,需要字段是keyword
),那么在创建索引是根据上述原理一样安排即可;
PUT /building
{
"settings":
{
"number_of_replicas": 3,
"number_of_shards": 1,
"max_result_window":1000000
},
"mappings":
{
"properties":
{
"signboard_list":
{
"type": "text" ,
"analyzer": "ik_smart" ,
"fields":
{
"keyword":
{
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}