Azure 搜索和破折号
Azure Search and Dashes
我正在使用 Azure 搜索并尝试对文档执行搜索:
好像是这样做的:/indexes/blah/docs?api-version=2015-02-28&search=abc\-1003
returns 与此相同的结果:/indexes/blah/docs?api-version=2015-02-28&search=abc-1003
第一个不应该 return 由于转义反斜杠而与第二个不同的结果吗?据我了解,反斜杠应该允许对 "abc-1003" 的整个字符串进行精确搜索,而不是执行 "not" 运算符。
(更多信息在这里:https://msdn.microsoft.com/en-us/library/azure/dn798920.aspx)
我让它工作的唯一方法是这样做(注意双引号):/indexes/blah/docs?api-version=2015-02-28&search="abc-1003"
我宁愿不这样做,因为这意味着让用户输入引号,而他们不知道该怎么做。
我期待的是我不应该期待的东西还是可能是 Azure 搜索的错误?
首先,没有以白色开头的破折号space 就像破折号,而不是否定运算符。
的 MSDN 文档
- Only needs to be escaped if it's the first character after whitespace, not if it's in the middle of a term. For example, "wi-fi" is a single term
其次,除非您使用的是 custom analyzer for your index,破折号将被分析器几乎像白色-space 一样对待,并将 abc-1003
分成两个标记,abc
和 1003
.
然后当您将它放在引号中时"abc-1003"
,它将被视为搜索短语 abc 1003
,从而返回您期望的结果。
如果您想在 abc-1003
上进行精确匹配,请考虑改用过滤器。它速度更快,可以匹配 guid 或带破折号的文本
添加到 Sean 的回答中,使用关键字分词器和小写分词过滤器的自定义分析配置将解决该问题。看来您正在使用默认的标准分析器,该分析器在索引时的词法分析期间用特殊字符断开单词。在查询时,这种词法分析适用于常规查询,而不适用于通配符搜索查询。结果,对于您的示例,您在搜索索引和通配符搜索查询中有 <1003> 未以相同方式标记化,并且查找以 abc-1003 开头的术语找不到它,因为这两个术语均未找到索引以 abc-1003 开头。希望这是有道理的。如果您有任何其他问题,请告诉我。
内特
documentation 表示连字符“-
”被视为必须转义的特殊字符。
实际上,连字符被视为标记的拆分,并且搜索两侧的单词,如 Sean Saleh pointed out。
经过小小的调查,我发现您不需要自定义分析器,built-in whitespace
就可以了。
以下是您的使用方法:
{
"name": "example-index-name",
"fields": [
{
"name": "name",
"type": "Edm.String",
"analyzer": "whitespace",
...
},
],
...
}
您使用此端点 update 您的索引:
https://{service-name}.search.windows.net/indexes/{index-name}?api-version=2017-11-11&allowIndexDowntime=true
不要忘记在请求 header 中包含 api-key
。
您还可以通过 analyzer test endpoint 测试此分析器和其他分析器:
{
"text": "Text to analyze",
"analyzer": "whitespace"
}
我正在使用 Azure 搜索并尝试对文档执行搜索:
好像是这样做的:/indexes/blah/docs?api-version=2015-02-28&search=abc\-1003
returns 与此相同的结果:/indexes/blah/docs?api-version=2015-02-28&search=abc-1003
第一个不应该 return 由于转义反斜杠而与第二个不同的结果吗?据我了解,反斜杠应该允许对 "abc-1003" 的整个字符串进行精确搜索,而不是执行 "not" 运算符。
(更多信息在这里:https://msdn.microsoft.com/en-us/library/azure/dn798920.aspx)
我让它工作的唯一方法是这样做(注意双引号):/indexes/blah/docs?api-version=2015-02-28&search="abc-1003"
我宁愿不这样做,因为这意味着让用户输入引号,而他们不知道该怎么做。
我期待的是我不应该期待的东西还是可能是 Azure 搜索的错误?
首先,没有以白色开头的破折号space 就像破折号,而不是否定运算符。
的 MSDN 文档- Only needs to be escaped if it's the first character after whitespace, not if it's in the middle of a term. For example, "wi-fi" is a single term
其次,除非您使用的是 custom analyzer for your index,破折号将被分析器几乎像白色-space 一样对待,并将 abc-1003
分成两个标记,abc
和 1003
.
然后当您将它放在引号中时"abc-1003"
,它将被视为搜索短语 abc 1003
,从而返回您期望的结果。
如果您想在 abc-1003
上进行精确匹配,请考虑改用过滤器。它速度更快,可以匹配 guid 或带破折号的文本
添加到 Sean 的回答中,使用关键字分词器和小写分词过滤器的自定义分析配置将解决该问题。看来您正在使用默认的标准分析器,该分析器在索引时的词法分析期间用特殊字符断开单词。在查询时,这种词法分析适用于常规查询,而不适用于通配符搜索查询。结果,对于您的示例,您在搜索索引和通配符搜索查询中有 <1003> 未以相同方式标记化,并且查找以 abc-1003 开头的术语找不到它,因为这两个术语均未找到索引以 abc-1003 开头。希望这是有道理的。如果您有任何其他问题,请告诉我。
内特
documentation 表示连字符“-
”被视为必须转义的特殊字符。
实际上,连字符被视为标记的拆分,并且搜索两侧的单词,如 Sean Saleh pointed out。
经过小小的调查,我发现您不需要自定义分析器,built-in whitespace
就可以了。
以下是您的使用方法:
{
"name": "example-index-name",
"fields": [
{
"name": "name",
"type": "Edm.String",
"analyzer": "whitespace",
...
},
],
...
}
您使用此端点 update 您的索引:
https://{service-name}.search.windows.net/indexes/{index-name}?api-version=2017-11-11&allowIndexDowntime=true
不要忘记在请求 header 中包含 api-key
。
您还可以通过 analyzer test endpoint 测试此分析器和其他分析器:
{
"text": "Text to analyze",
"analyzer": "whitespace"
}