ElasticSearch如何设置某个字段被检索时忽略全角半角格式

部分数据在获取时有全角半角的问题,尤其是英文字母,底层所有数据的清洗工作量太大,且涉及数据种类多,字段多。
所以想从检索方面下手,标点在检索时是可以直接忽略的,不知道有没有忽略全角半角的功能。

ElasticSearch提供了一个字符过滤器(Character Filter)叫做"normalize_charmap",它可以在检索时将指定字符映射成其他字符,从而实现忽略全角半角格式的功能。

具体步骤如下:

1.在创建索引时,在分析器中指定字符过滤器(normalize_charmap)。
例如:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "A=>A",
            "B=>B",
            "0=>0",
            "1=>1",
            ...
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}


2.搜索时,使用相同的分析器进行分词和字符过滤。
例如:

GET /my_index/_search
{
  "query": {
    "match": {
      "my_field": {
        "query": "abc123",
        "analyzer": "my_analyzer"
      }
    }
  }
}


在上面的例子中,将全角的大写字母和数字映射成对应的半角字符,从而在搜索时忽略全角半角格式的差异。

需要注意的是,使用字符过滤器会增加索引和搜索的开销,因此需要根据实际情况进行权衡。


以上回答如果对您有用,望采纳~谢谢