前言
近期遇到了使用ES搜索时,有个别的字段需要实现类似于mysql中的Like效果。不跳词,并且可以通配符搜索。
应用场景
这里以一个商品有商品名需要跳词搜索,而商品的地址就有多地址,而这个多地址是不能跳词的。所以需要用到类似mysql中like搜索的效果。如果搜索地址使用分词搜索的话,搜索广州时,广西,苏州也会被搜索出来,所以需要like来进行搜索。 在ES中搜索时,有很多种模式,下面就是相应关键字对应的搜索模式。
关键字 | 效果 |
---|
term系列 | 精确搜素 | match系列 | 精确搜索、模糊搜索 | exists | 指定字段存在(有值) | prefix | 前缀匹配,只能是keyword类型的字段 | wildcard | 通配符 | regexp | 正则表达式匹配 | ids | 根据id进行查询 |
在这里我们使用的关键字就是wildcard 。下面来进行实操。 索引
PUT test_goods
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1"
},
"analysis": {
"analyzer": {
"test_analyzer": {
"tokenizer": "standard"
}
}
}
},
"mappings":{
"properties": {
"goods_name": {
"type": "text",
"analyzer": "test_analyzer"
},
"goods_addr": {
"type": "keyword"
}
}
}
}
查询语句 对比的mysql语句为:select * from test_goods where goods_addr like '%郑州%' or goods_addr like '%深圳%'
GET test_goods/_search
{
"from": 0,
"size": 10000,
"query": {
"bool": {
"should": [
{
"wildcard": {
"goods_addr": "*郑州*"
}
},
{
"wildcard": {
"goods_addr": "*深圳*"
}
}
]
}
},
"_source": true,
"sort": {
"_score": {
"order": "desc"
}
}
}
总结
这样就能又能进行分词搜索,又能进行like查询。
|