带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(15)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(15)

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(14) https://developer.aliyun.com/article/1229755



 身份证号分词示例


在本例中我们要实现通过输入员工的身份证号匹配员工信息。输入时除了支持整体匹配以外同时还要支持使用部分内容的模糊匹配如:出生日期/身份证号后八位/后六位/后四位等关键信息。索引包含以下四个字段:

 

l ID 文本类型,身份证号,需要分词器实现模糊匹配。

l emplyee_name 文本类型,员工姓名。

l dept 文本类型,所在部门。

l mobile 文本类型,联系方式。

 

模糊匹配要想实现身份证号信息提取,首先需要了解一下身份证号的信息规则:二代身份证号长度为18位,其中前六位中每两位分别表示签发的省市区的行政规划代码,7-14位表示出生年月日,15-16位表示派出所代码,17位标识性别,奇数为男性,偶数为女性,而最后一位是用于校验信息的校验码由0-9或X组成。按本例中的要求创建的自定义分词器需要满足一个身份证号处理后能提取到整体(1-18位),出生年月(7-14位),后八位(11-18位),后六位(14-18位),后四位(15-18位)五种场景。直接使用 Tokenizer 按照位置切分目前在 Elasticsearch 中没有满足需求的组件,所以就需要考虑一下身份证号在切分前进行变形。我们可以在

Char_Filter 阶段使用 pattern_replace 将身份证号按照规则将内容提取后使用空格追加到原有身份证号的后面,如 “110102199007050722” 处理后会变成 “110102199007050722 19900705 07050722 050722 0722”,然后再使用空格切分即可。分词器 ID_analyzer 结构如下:


 l Char Filter

Pattern Replace Filter,匹配到的内容进行替换

 

l Tokenizer

whitespace Tokenizer

 

l Token Filter

Lowercase Token Filter,单词转换为小写字母统一格式


定义正则表达式 (\d{6})(\d{4})(\d{2})(\d{2})([\dxX]{4}) 把字符串按照位置进行了一个分组,这样就可以在 replacement 中按照分组标签来进行字符串拼接。和上一例一样,在搜索时需要将输入的内容当作整体来匹配不进行提取替换操作,其它设置和写入分词器保持一致,分词器 ID_

search 结构如下:

 

l Tokenizer

whitespace Tokenizer

 

l Token Filter

Lowercase Token Filter,单词转换为小写字母统一格式

 

PUT employee_info
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ID_analyzer": {
          "type": "custom",
          "char_filter": [
            "ID_char_filter
          ],
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        },
        "ID_search": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        }
      },
      "char_filter": {
        "ID_char_filter": {
          "type": "pattern_replace",
          "pattern": """(\d{6})(\d{4})(\d{2})(\d{2})([\dxX]{4})""",
          "replacement": "$0 $2$3$4 $3$4$5 $4$5 $5"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "ID": {
        "type": "text",
        "analyzer": "ID_analyzer",
        "search_analyzer": "ID_search"
      },
      "employee_name":{
        "type": "text"
      },
      "dept": {
        "type": "keyword"
      },
      "mobile":{
        "type": "keyword"
      }
    }
  }
}
POST _bulk
{"index":{"_index":"employee_info","_id": "1"}}
{"employee_name":"符杰","ID":"110102199007050722","dept":"IT","mobile":"13853411491"}
{"index":{"_index":"employee_info","_id": "2"}}
{"employee_name":"熊志胜","ID":"130102198610211600","dept":"BU","mobile":"13758526665"}
{"index":{"_index":"employee_info","_id": "3"}}
{"employee_name":"安晨龙","ID":"143105199605078636","dept":"IT","mobile":"16602029900"}
{"index":{"_index":"employee_info","_id": "4"}}
{"employee_name":"尚静","ID":"110105198807206667","dept":"HR","mobile":"15170488414"}
{"index":{"_index":"employee_info","_id": "5"}}
{"employee_name":"邹松彬","ID":"22010219830713347X","dept":"LAW","mobile":"18741918417"}

查询测试数据生日为 19900705 或后四位是 347x 的员工信息,都能返回查询结果。


GET employee_info/_search
{
  "query": {
    "match": {
      "ID":  "19900705 347x"
    }
  }



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
算法
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(8)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(8)
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(13)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(13)
|
自然语言处理 算法 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(4)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(4)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(3)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(3)
|
存储 自然语言处理 算法
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(10)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(10)
104 0
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(2)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(2)
|
索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(7)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(7)
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(1)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(1)
|
存储 自然语言处理 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(6)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(6)
101 0
|
存储 算法 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(11)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(11)

热门文章

最新文章