如何通过 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 作为分词器。