白色 space 的 Azure 搜索服务问题和特殊字符的通配符搜索

Azure search services issue for white space and wildcard search of special characters

我们有一个应用程序允许用户在摘要字段中输入任何内容。用户可以输入任何特殊字符,如#$!@~ 等,包括白色 space,他们要求也可以基于这些特殊字符进行搜索。例如,其中一个条目是“test testing **** #### !!!!! ???? @ $”。

我用分析器创建了一个认知搜索索引standard.lucene,如下所示:

{ "name": "摘要", “类型”:“Edm.String”, “可搜索”:是的, “可过滤”:是的, “可检索”:是的, “可排序”:是的, “facetable”:真实的, “钥匙”:假的, “索引分析器”:空, “搜索分析器”:空, “分析仪”:“standard.lucene”, “同义词映射”:[] }

当我使用邮递员查询时:

{ "顶部":"1000", “查询类型”:“完整”, "搜索模式":"全部", “搜索”:“测试”, "searchFields": "总结", “计数”:真 }

我能得到预期的结果

如果我使用以下内容:

{ "顶部":"1000", “查询类型”:“完整”, "搜索模式":"全部", "search": "测试****", "searchFields": "总结", “计数”:真 }

我收到“InvalidRequestParameter”错误。

如果我改成下面的查询:

{ "顶部":"1000", “查询类型”:“完整”, "搜索模式":"全部", “搜索”: ””****””, "searchFields": "总结", “计数”:真 }

然后我没有得到任何结果。

根据这篇文章: https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#escaping-special-characters

为了将任何搜索运算符用作搜索文本的一部分,请通过在字符前面加上一个反斜杠 () 来转义该字符。 需要转义的特殊字符包括:

我需要为特殊字符加上单个反斜杠作为前缀。但就我而言,它似乎不起作用。任何帮助将不胜感激!

如果您使用标准的 lucene 分析器进行索引,我相信“****”不会保存为单词。 Lucene 分析器在特殊字符上打断单词。

对于您需要搜索的字段,例如示例中的 summary 字段,您需要为该字段创建自定义分析器。 This document 谈论如何做到这一点,测试你的分析仪。一旦你构建了一个分析器来按照你想要的方式标记输入,你就可以在你的索引定义中使用它,如下所示。

...
{
  "name": "Summary",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": "custom_analyzer_for_tokenizing_as_is"
},
...

我终于通过创建自定义分析器解决了这个问题。指标定义:

{
    "name": "FieldName",
    "type": "Edm.String",
    "searchable": true,
    "filterable": true,
    "retrievable": true,
    "sortable": true,
    "facetable": true,
    "key": false,
    "indexAnalyzer": null,
    "searchAnalyzer": null,
    "analyzer": "specialcharanalyzer",
    "synonymMaps": []
},

分析器指定如下:

"analyzers": [
    {
        "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
        "name": "specialcharanalyzer",
        "tokenizer": "whitespace",
        "tokenFilters": [
            "lowercase"
        ],
        "charFilters": []
    }
],

那么就可以使用本文件指定的格式https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#special-characters

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

需要转义的特殊字符包括:

+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

对于不在上述要求的转义字符中的字符,使用以下格式进行中缀搜索:

"search": "/.*SearchChar.*/",

例如,如果要搜索 $,则使用以下格式:

"search": "/.*$.*/",

对于列表中的特殊字符,使用此格式:

"search" : "/.*\escapingcharacter.*/",

例如要搜索 +,请使用以下查询;

"search" : "/.*\+.*/",

# 如果在语句中,也被认为是转义字符。

要搜索 *,请使用以下格式:

"search":"/\**/",