我们现在在一些特定于语言的字段上使用Azure搜索Microsoft语言分析器。在大多数情况下,它比标准的Lucene语言分析器具有更好的相关性。但是在验证en.microsoft analyzer时发现了一个问题。
问题是,如果字段值包含数字。分析仪很智能,允许在数字前面加上冗余的“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”填充?
遗憾的是,您无法更改Microsoft标记生成器规范化数字的方式。要解决此限制,您可以为产品属性选择不同的分析器,或者在分析器配置中添加字符过滤器,对数字字符进行编码,以便令牌器忽略它们,例如,使用以下数字将每个数字映射到预期字符集外部的字符中。 MappingCharFilter。你可以找到here的例子,使用MicrosoftLanguageStemmingTokenizer作为你的标记器。