如何通过 en.microsoft 分析器自定义数字标记化?
How to customize tokenization of numbers by the en.microsoft analyzer?
我们现在在某些语言特定领域使用 Azure 搜索 Microsoft 语言分析器。在大多数情况下,它比标准的 Lucene 语言分析器具有更好的相关性。但是我们在验证 en.microsoft 分析器时发现了一个问题。
问题是,如果字段值包含数字。分析仪很聪明,允许数字前面有多余的“0”。
例如:
POST /analyze?api-version=2017-11-11
{
"text": "1",
"analyzer": "en.microsoft"
}
响应是:
"tokens": [
{
"token": "1",
"startOffset": 0,
"endOffset": 2,
"position": 0
},
{
"token": "nn1",
"startOffset": 0,
"endOffset": 2,
"position": 0
}
]
问题是,如果字段值为“01”,则所有文本如“01”、“001”、“0001”……都将匹配该字段。
我们有一个字段来保存产品属性 name/value 对,例如“brand:Contoso|size:1”。那么即使搜索“0001”也可以return这个字段值的文档。这不是我们想要的。
所以,我的问题是,有没有什么方法可以自定义 en.microsoft 分析器,这样我们就可以利用分析器强大的词干分析器,同时避免在数字?
遗憾的是,您无法更改 Microsoft 分词器规范化数字的方式。要解决此限制,您可以为产品属性选择不同的分析器,或者将字符过滤器添加到分析器配置中以对数字字符进行编码,以便分词器忽略它们,例如,使用以下方法将每个数字映射到预期字符集之外的字符MappingCharFilter.You can find examples here,使用 MicrosoftLanguageStemmingTokenizer 作为分词器。
我们现在在某些语言特定领域使用 Azure 搜索 Microsoft 语言分析器。在大多数情况下,它比标准的 Lucene 语言分析器具有更好的相关性。但是我们在验证 en.microsoft 分析器时发现了一个问题。
问题是,如果字段值包含数字。分析仪很聪明,允许数字前面有多余的“0”。
例如:
POST /analyze?api-version=2017-11-11
{
"text": "1",
"analyzer": "en.microsoft"
}
响应是:
"tokens": [
{
"token": "1",
"startOffset": 0,
"endOffset": 2,
"position": 0
},
{
"token": "nn1",
"startOffset": 0,
"endOffset": 2,
"position": 0
}
]
问题是,如果字段值为“01”,则所有文本如“01”、“001”、“0001”……都将匹配该字段。
我们有一个字段来保存产品属性 name/value 对,例如“brand:Contoso|size:1”。那么即使搜索“0001”也可以return这个字段值的文档。这不是我们想要的。
所以,我的问题是,有没有什么方法可以自定义 en.microsoft 分析器,这样我们就可以利用分析器强大的词干分析器,同时避免在数字?
遗憾的是,您无法更改 Microsoft 分词器规范化数字的方式。要解决此限制,您可以为产品属性选择不同的分析器,或者将字符过滤器添加到分析器配置中以对数字字符进行编码,以便分词器忽略它们,例如,使用以下方法将每个数字映射到预期字符集之外的字符MappingCharFilter.You can find examples here,使用 MicrosoftLanguageStemmingTokenizer 作为分词器。