您的位置 首页 elasticsearch

es DSL 查询特殊字符 (转义字符) [ERROR]

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

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章