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

时间:2020-11-10 23:49:41

标签: lucene full-text-search azure-cognitive-search full-text-indexing

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

需要转义的特殊字符包括:+-&| ! (){} [] ^“〜*?:\ /

但是,如果您使用Default analyzer,那么仅此一项将不适用于任何属性。您可以直接通过REST测试分析仪。如果使用标准分析器分析字符串!asdf ,则会看到输出为 asdf

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

如果要在索引中包含感叹号,则必须使用不剥离!字符的分析器。有关为每个属性定义分析器的信息,请参见How to specify analyzers

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

将字段的全部内容作为单个标记处理。这很有用 邮政编码,ID和一些产品名称之类的数据。

我们可以通过上传两个测试项目进行测试。一个标题为“ 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"
    }