使用Elasticsearch做手机号和身份证号的模糊检索

使用Elasticsearch做手机号和身份证号的模糊检索

背景

客户想通过人名 四位数值 来检索人的信息 例如 张三 3421,例如需要检索包含张三和且手机号或者身份证里包含3421的数据

过程

es集群使用的是ik_max_word分词器,该分词器不会对手机号和身份证号进行分词,是无法做到手机号或者身份证的模糊检索的,如果要做的话,需要使用正则(效率极低)

后来有同事提出对手机号和身份证号进行拆分达到分词的效果 例如 13088886666,在存储的时候拆分为130 8888 6666,es在存储的时候 会将这个字符串拆分为三串,所以可以达到检索的要求,但是如果想搜8866,那么实际上是检索不到数据的。

轻舟已过万重山


使用自定义分词器ngram,上图就是使用ngram分词器之后的效果,ngram会进行滑步分词,且遵循排列组合

完整的mapping如下
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1,
        "index":{
            "sort.field":"business_time",
            "sort.order":"desc",
            "max_ngram_diff": 14
        },
        "analysis":{
            "analyzer":{
                "phoneNo_analyzer":{
                    "tokenizer": "phoneNo_analyzer"
                },
                "cardNo_analyzer":{
                    "tokenizer": "cardNo_analyzer"
                }
            },
            "tokenizer":{
                "phoneNo_analyzer":{
                    "type": "ngram",
                    "min_gram": 4,
                    "max_gram": 11,
                    "token_chars": [
                        "letter","digit"
                    ]
                },
                "cardNo_analyzer":{
                    "type": "ngram",
                    "min_gram": 4,
                    "max_gram": 18,
                    "token_chars": [
                        "letter","digit"
                    ]
                }
            }
        }
    },
    "mappings":{
        "dynamic":"strict",
        "properties":{
            "content":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "business_time":{
                "type":"date",
                "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis||yyyy-MM-dd HH:mm:ss.S||yyyy-MM-dd HH:mm:ss.SS||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss.SSSS||yyyy-MM-dd HH:mm:ss.SSSSS||yyyy-MM-dd HH:mm:ss.SSSSSS"
            },
            "cardNo": {
                "type":"text",
                "analyzer": "cardNo_analyzer"
            },
            "phoneNo":{
                "type":"text",
                "analyzer": "phoneNo_analyzer"
            }
        }
    }
}

结果

posted @ 2024-02-20 14:41  实习小生  阅读(88)  评论(0编辑  收藏  举报