电话号码分析器
analysis-phonenumber
插件提供了用于解析电话号码的分析器和分词器。需要专门的分析器,因为解析电话号码是一项不简单的任务(尽管初看起来可能很简单)。有关电话号码解析的常见误解,请参阅 程序员对电话号码的常见误解。
OpenSearch 支持以下电话号码分析器
phone
:用于索引时的一个索引分析器。phone-search
:用于搜索时的一个搜索分析器。
在内部,该插件使用 libphonenumber
库并遵循其解析规则。
电话号码分析器并非旨在在较大的文本中查找电话号码。相反,您应该将它们用于仅包含电话号码的字段。
安装插件
在使用电话号码分析器之前,您必须通过运行以下命令安装 analysis-phonenumber
插件
./bin/opensearch-plugin install analysis-phonenumber
指定默认区域
您可以通过在分析器中提供 phone-region
参数来选择性地指定解析电话号码的默认区域。有效的电话区域由 ISO 3166 国家代码表示。有关更多信息,请参阅 ISO 3166 国家代码列表。
当对包含国际拨号前缀 +
的电话号码进行分词时,默认区域无关紧要。然而,对于使用国家前缀拨打国际号码的电话号码(例如,从大多数欧洲国家拨打北美使用 001
而不是 +1
),则需要提供区域。您还可以通过指定区域来正确索引没有国际前缀的本地电话号码。
示例
以下请求创建一个索引,其中包含一个字段,用于摄取瑞士的电话号码(区域代码 CH
)
PUT /example-phone
{
"settings": {
"analysis": {
"analyzer": {
"phone-ch": {
"type": "phone",
"phone-region": "CH"
},
"phone-search-ch": {
"type": "phone-search",
"phone-region": "CH"
}
}
}
},
"mappings": {
"properties": {
"phone_number": {
"type": "text",
"analyzer": "phone-ch",
"search_analyzer": "phone-search-ch"
}
}
}
}
电话分析器
phone
分析器根据给定的电话号码生成 n-gram。包含国际拨号前缀的(虚构的)瑞士电话号码可以带或不带瑞士特定的电话区域进行解析。因此,以下两个请求将产生相同的结果
GET /example-phone/_analyze
{
"analyzer" : "phone-ch",
"text" : "+41 60 555 12 34"
}
GET /example-phone/_analyze
{
"analyzer" : "phone",
"text" : "+41 60 555 12 34"
}
响应包含生成的 n-gram
["+41 60 555 12 34", "6055512", "41605551", "416055512", "6055", "41605551234", ...]
然而,如果您在指定电话号码时不带国际拨号前缀 +
(无论是使用 0041
还是完全省略国际拨号前缀),那么只有配置了正确电话区域的分析器才能解析该号码。
GET /example-phone/_analyze
{
"analyzer" : "phone-ch",
"text" : "060 555 12 34"
}
phone-search 分析器
相比之下,phone-search
分析器不创建 n-gram,只发出一些基本词元。例如,发送以下请求并指定 phone-search
分析器
GET /example-phone/_analyze
{
"analyzer" : "phone-search",
"text" : "+41 60 555 12 34"
}
响应包含以下词元
["+41 60 555 12 34", "41 60 555 12 34", "41605551234", "605551234", "41"]