不区分大小写的Azure搜索

时间:2018-07-31 07:58:41

标签: azure lucene azure-search

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

已设置分析器,因此它与搜索分析器没有不同。

但是,当我使用REST API搜索大写或大小写混合时,没有任何结果。我只搜索小写字母。

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

当然有可能我没有正确实现CustomAnalyzer,但使用Analyze端点,它似乎已经用小写标记了。

这是我的json,我将其发布到CreateIndex以用于自定义分析器

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

那我在做什么错了?

很显然,我可以通过在发送之前将所有内容都放小写来控制发送到搜索端点的内容,但我认为它仍然可以正常工作。

谢谢

1 个答案:

答案 0 :(得分:0)

看起来“连字符”字段指向名为“ pdh”的自定义分析器。我希望这是您输入的示例中的错字,因为使用“ pdh”不存在,使用此配置创建索引将失败。请确认。

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

如果您可以共享,我很好奇您要用于测试查询字词的内容以及索引中包含的内容。

希望这会有所帮助。

迈克