如何自定义en.microsoft分析器?

时间:2019-03-13 18:47:10

标签: azure-search

我们现在在某些特定于语言的字段上使用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”,……)都将与该字段匹配。

我们有一个字段来保存产品属性名称/值对,例如“ brand:Contoso | size:1”。然后,即使搜索“ 0001”也可以返回具有该字段值的文档。这不是我们想要的。

所以,我的问题是,有什么方法可以自定义en.microsoft分析器,以便我们可以利用分析器强大的词干分析器,而避免在数字前填充“ 0”? >

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法更改Microsoft标记程序对数字进行标准化的方式。要解决此限制,您可以为产品属性选择不同的分析器,或在分析器配置中添加字符过滤器以对数字字符进行编码,以便令牌生成器将其忽略,例如,使用MappingCharFilter。您可以找到示例here,并使用MicrosoftLanguageStemmingTokenizer作为令牌生成器。