【问题标题】:case insensitive Azure search不区分大小写的 Azure 搜索
【发布时间】:2018-08-01 04:58:06
【问题描述】:

我在索引中的某个字段上有一个自定义分析器。分析器使用 PatternTokenizer 将连字符的单词放在一起。它使用一个小写令牌过滤器(@odata.type: #Microsoft.Azure.Search.LowercaseTokenFilter),因此单词以小写形式存储在索引中。

分析器已设置,因此它与搜索分析器不是不同的索引分析器。

但是,当我使用 REST api 搜索大写或混合大小写术语时,我没有得到任何结果。我只得到搜索小写的结果。

由于搜索和索引的分析器是相同的,即使搜索大写字母,我也会得到预期的结果。

当然,我可能没有正确实现 CustomAnalyzer,但使用分析端点时,它似乎已经以小写形式进行了标记。

这是我为自定义分析器发布到 CreateIndex 的 json

{
"@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": []
}

那我做错了什么?

显然,我可以通过在发送之前将所有内容小写来控制发送到搜索端点的内容,但我认为无论如何它应该可以工作。

谢谢

【问题讨论】:

    标签: azure lucene azure-cognitive-search


    【解决方案1】:

    它看起来“连字符”字段指向一个名为“pdh”的自定义分析器。我希望这是您示例中的一个错字,因为由于“pdh”不存在,因此创建索引应该会因此配置而失败。请确认。

    在大多数情况下,Azure 搜索会在查询时对搜索词运行分析器。最值得注意的例外是搜索词中有通配符并且无法分析。因此,如果您使用分析器将数据标准化为小写,则该术语在查询时也应该小写。您可以将分析 API 与您的自定义分析器一起使用,以查看如何处理术语。 更多信息:https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer

    如果您可以分享,我很好奇您使用什么作为测试查询词以及您在索引中的内容。

    希望这会有所帮助。

    迈克

    【讨论】:

    • 谢谢 - 抱歉回复晚了。这帮助我解决了我的问题。从那以后一直很忙:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2013-09-26
    • 2023-03-20
    • 1970-01-01
    • 2011-01-02
    • 2013-02-17
    相关资源
    最近更新 更多