Elastic:如何查询特殊字符
Elastic:如何查询特殊字符_es查询特殊字符转义-CSDN博客
es DSL 语句查询 实战1 : 连接
es DSL实战2 (日志查询): 连接
es DSL 查询特殊字符 (转义字符) :连接
Elasticsearch如何更新mapping : 连接
场景:
某些业务场景下我们需要使用特殊符号来进行查询,但是es的默认分词器以及ik分词器等大多数分词器都会将特殊符号过滤掉,导致后续无法通过特殊符号查询到数据
比如:[]
这个问题怎么解决呢
我们还原一下问题,
1- 准备数据:
(1)设置mapping
PUT test_special
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
(2)、插入带有特殊符号的数据
PUT test_special/_doc/1
{"name":"55555@#!sina.com"}
检查一下:
GET test_special/_search
2- 问题还原
我们去查询
通过‘@’去查询原数据
GET test_special/_search
{
"query": {
"match": {
"name": "@#!"
}
}
}
结果为空
我们想查出来怎么办呢?
三、解决方案 :
1-使用keyword查询
首先从业务层考虑,是否需要单个的特殊符号查询,还是说是带上特殊符号的查询词搜索,所以先从最简单的用keyword+term查询试试看能够满足业务需求
GET test_special/_search
{
"query": {
"term": {
"name.keyword": "55555@#!sina.com"
}
}
}
查询如下
2 mapping映射,防止过滤
这里的特殊字符的别名用两个点隔开,并且加上了xxx
前缀,点的作用是为了让其被单独分词,也可以替换成逗号,前缀的目的是为了让特殊字符的别名唯一,后续插入的数据不会和这个重复。xxx
可以是你公司的名称或者其他含义的前缀。
PUT test_special
{
"settings": {
"analysis": {
"analyzer": {
"special_analyzer": {
"tokenizer": "standard",
"char_filter": [
"special_mapping"
]
}
},
"char_filter": {
"special_mapping":{
"type": "mapping",
"mappings": [
"@=>.xxxAt.",
"#=>.xxxJin.",
"!=>.xxxSigh.",
"*=>.xxxXing."
]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "special_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
欢迎来撩 : 汇总all