具有特殊字符的认知搜索通配符搜索

Cognitive search wild card search with special characters

我们正在使用认知搜索来满足搜索要求,但我无法在具有特殊字符的字段上进行通配符搜索。

例如,如果文档中的名称字段具有值 - asdf,我可以使用搜索文本 as* 并获取此文档。

但是,如果此文档中此名称字段的值为 !asdf,我将无法使用通配符进行搜索。我尝试使用术语 !as*\!as*/\!as*/ 进行搜索。这仅在我执行 !asdf.

时有效

当字段中有特殊字符时,无法使用通配符搜索。我正在使用查询类型 full

如果您查看 Full Lucene 模式的文档,您会发现感叹号 (!) 被视为特殊字符,必须使用反斜杠进行转义。

https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#escaping-special-characters

Special characters that require escaping include the following: + - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

但是,如果您使用 Default analyzer,仅此一项对任何 属性 都不起作用。您可以直接通过 REST 测试分析器。如果我们使用标准分析器分析字符串 !asdf,我们会看到输出是 asdf.

    "tokens": [
    {
        "token": "asdf",
        "startOffset": 1,
        "endOffset": 5,
        "position": 0
    }
]

如果您希望感叹号包含在您的索引中,您必须使用不去除 ! 字符的分析器。有关根据 属性.

定义分析器的信息,请参阅 How to specify analyzers

要找到合适的分析器,可以参考Predefined Analyzers Reference。在这里您会找到预配置分析器的列表。对于这种特殊情况,关键字分析器将起作用。

Treats the entire content of a field as a single token. This is useful for data like zip codes, IDs, and some product names.

我们可以通过上传两个测试项目来进行测试。一个标题为“asdf”,另一个标题为“!asdf”。

{
"value": [
    {
        "@search.action": "mergeOrUpload",
        "Id": "1",
        "Title": "asdf"
    },
    {
        "@search.action": "mergeOrUpload",
        "Id": "2",
        "Title": "!asdf"
    }
]

}

然后我们查询

\!as* 

(注意转义的 ! 字符)并按预期在结果中获得 1 个文档:

    "@odata.count": 1,
    "value": [
    {
        "@search.score": 1.0,
        "Id": "2",
        "Title": "!asdf"
    }