不区分大小写的 Azure 搜索
case insensitive Azure search
我在索引中的一个字段上有一个自定义分析器。分析器使用 PatternTokenizer 将带连字符的单词放在一起。它使用 LowercaseTokenFilter (@odata.type: #Microsoft.Azure.Search.LowercaseTokenFilter) 因此单词以小写形式存储在索引中。
分析器已设置为与搜索分析器不同的索引分析器。
然而,当我使用 REST api 搜索大写或混合大小写术语时,我没有得到任何结果。我只得到搜索小写字母的结果。
由于搜索和索引的分析器相同,即使搜索大写字母,我也会得到预期的结果。
当然有可能我没有正确实现 CustomAnalyzer,但使用 Analyze 端点它似乎已经标记为小写。
这是我的 json,我 post 为自定义分析器
创建索引
{
"@odata.context": "https://dev-xxx.search.windows.net/$metadata#indexes/$entity",
"@odata.etag": "\"0x8D5F638C546D690\"",
"name": "myproducts",
"fields": [
{
"name": "id",
"type": "Edm.String",
"searchable": false,
"filterable": false,
"retrievable": true,
"sortable": false,
"facetable": false,
"key": true,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": null,
"synonymMaps": []
},
{
"name": "materialId",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "standard.lucene",
"synonymMaps": []
},
{
"name": "name",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "standard.lucene",
"synonymMaps": []
},
{
"name": "hyphenated",
"type": "Collection(Edm.String)",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": false,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "pdh",
"synonymMaps": []
}
],
"scoringProfiles": [],
"defaultScoringProfile": null,
"corsOptions": null,
"suggesters": [],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "xxx",
"tokenizer": "xxx",
"tokenFilters": [
"xxxlowercase"
],
"charFilters": []
}
],
"tokenizers": [
{
"@odata.type": "#Microsoft.Azure.Search.PatternTokenizer",
"name": "xxx",
"pattern": "([a-z])(?![\w-])",
"flags": null,
"group": -1
}
],
"tokenFilters": [
{
"@odata.type": "#Microsoft.Azure.Search.LowercaseTokenFilter",
"name": "xxxlowercase"
}
],
"charFilters": []
}
所以我做错了什么?
显然,我可以通过在发送之前将所有内容小写来控制发送到搜索端点的内容,但我认为它应该可以正常工作。
谢谢
看起来字段 "hyphenated" 指向一个名为 "pdh" 的自定义分析器。我希望这是您示例中的错字,因为使用此配置创建索引应该会失败,因为 "pdh" 不存在。请确认。
在大多数情况下,Azure 搜索会在查询时根据搜索词运行分析器。最显着的例外是搜索词中有通配符且无法分析时。因此,如果您使用分析器将数据规范化为小写,则该术语在查询时也应为小写。您可以将 Analyze API 与您的自定义分析器一起使用,以查看如何处理术语。
更多信息:https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer
如果您可以分享,我很好奇您在测试查询词中使用什么以及索引中有什么。
希望对您有所帮助。
麦克
我在索引中的一个字段上有一个自定义分析器。分析器使用 PatternTokenizer 将带连字符的单词放在一起。它使用 LowercaseTokenFilter (@odata.type: #Microsoft.Azure.Search.LowercaseTokenFilter) 因此单词以小写形式存储在索引中。
分析器已设置为与搜索分析器不同的索引分析器。
然而,当我使用 REST api 搜索大写或混合大小写术语时,我没有得到任何结果。我只得到搜索小写字母的结果。
由于搜索和索引的分析器相同,即使搜索大写字母,我也会得到预期的结果。
当然有可能我没有正确实现 CustomAnalyzer,但使用 Analyze 端点它似乎已经标记为小写。
这是我的 json,我 post 为自定义分析器
创建索引{
"@odata.context": "https://dev-xxx.search.windows.net/$metadata#indexes/$entity",
"@odata.etag": "\"0x8D5F638C546D690\"",
"name": "myproducts",
"fields": [
{
"name": "id",
"type": "Edm.String",
"searchable": false,
"filterable": false,
"retrievable": true,
"sortable": false,
"facetable": false,
"key": true,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": null,
"synonymMaps": []
},
{
"name": "materialId",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "standard.lucene",
"synonymMaps": []
},
{
"name": "name",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "standard.lucene",
"synonymMaps": []
},
{
"name": "hyphenated",
"type": "Collection(Edm.String)",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": false,
"facetable": true,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": "pdh",
"synonymMaps": []
}
],
"scoringProfiles": [],
"defaultScoringProfile": null,
"corsOptions": null,
"suggesters": [],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "xxx",
"tokenizer": "xxx",
"tokenFilters": [
"xxxlowercase"
],
"charFilters": []
}
],
"tokenizers": [
{
"@odata.type": "#Microsoft.Azure.Search.PatternTokenizer",
"name": "xxx",
"pattern": "([a-z])(?![\w-])",
"flags": null,
"group": -1
}
],
"tokenFilters": [
{
"@odata.type": "#Microsoft.Azure.Search.LowercaseTokenFilter",
"name": "xxxlowercase"
}
],
"charFilters": []
}
所以我做错了什么?
显然,我可以通过在发送之前将所有内容小写来控制发送到搜索端点的内容,但我认为它应该可以正常工作。
谢谢
看起来字段 "hyphenated" 指向一个名为 "pdh" 的自定义分析器。我希望这是您示例中的错字,因为使用此配置创建索引应该会失败,因为 "pdh" 不存在。请确认。
在大多数情况下,Azure 搜索会在查询时根据搜索词运行分析器。最显着的例外是搜索词中有通配符且无法分析时。因此,如果您使用分析器将数据规范化为小写,则该术语在查询时也应为小写。您可以将 Analyze API 与您的自定义分析器一起使用,以查看如何处理术语。 更多信息:https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer
如果您可以分享,我很好奇您在测试查询词中使用什么以及索引中有什么。
希望对您有所帮助。
麦克