白色 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":"/\**/",
我们有一个应用程序允许用户在摘要字段中输入任何内容。用户可以输入任何特殊字符,如#$!@~ 等,包括白色 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":"/\**/",