Elasticsearch使用pattern_replace过滤器忽略查询里的特殊字符

时间:2023-01-05 17:51:58

假设elasticsearch的一个字段存储了包含字母,数字以及特殊字符的字符串作为值,如ABC-123-456。

现在用户输入以下字符希望能匹配此值:

  • 完全匹配:ABC-123-456
  • 忽略特殊字符:ABC123456
  • 小写且忽略特殊字符:abc123456
  • 混有其他特殊字符串:Ab.c-123,456

这里可以使用pattern_replace过滤器以及自定义一个分析器来处理。

1、定义pattern_replace过滤器

"char_filter": {
    "specialCharactersFilter": {
        "pattern": "[^A-Za-z0-9]",
        "type": "pattern_replace",
        "replacement": ""
    }
}

2、使用上面的过滤定义分析器

"analyzer": {
    "alphanumericStringAnalyzer": {
        "filter": "lowercase",
        "char_filter": [
            "specialCharactersFilter"
        ],
        "type": "custom",
        "tokenizer": "standard"
    }
}

分析器命名为alphanumericStringAnalyzer

3、使用以上的分析器设置字段的映射

"order": {
    "type": "text",
    "fields": {
        "alphanumeric": {
        "type": "text",
            "analyzer": "alphanumericStringAnalyzer"
        },
        "raw": {
            "type": "keyword"
        }
    }
}