我正在使用Azure搜索并尝试对文档执行搜索:
好像这样做:/indexes/blah/docs?api-version=2015-02-28&search=abc\-1003
返回与此相同的结果:/indexes/blah/docs?api-version=2015-02-28&search=abc-1003
由于逃避向后斜线,第一个不应该返回与第二个不同的结果吗?根据我的理解,反向斜杠应该允许在整个“abc-1003”字符串上进行精确搜索,而不是做“非”运算符。
(更多信息:https://msdn.microsoft.com/en-us/library/azure/dn798920.aspx)
我能让它发挥作用的唯一方法就是这样做(注意双引号):/indexes/blah/docs?api-version=2015-02-28&search="abc-1003"
我宁愿不这样做,因为这意味着让用户输入引号,他们不知道该怎么做。
我期待一些我不应该或者可能是Azure搜索的错误吗?
答案 0 :(得分:3)
首先,没有以空格开头的破折号就像破折号,而不是否定操作符。
的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,否则分析符将会将分析符视为空格,并将abc-1003
分为两个标记,abc
和{{1 }}
然后,当您将其放在引号1003
中时,它将被视为搜索短语"abc-1003"
,从而返回您期望的内容。
如果您想在abc 1003
上完全匹配,请考虑使用过滤器。它更快,可以使用短划线匹配GUID或文本等内容
答案 1 :(得分:1)
根据Sean的回答,使用关键字tokenizer和小写tokenfilter的自定义分析配置将解决此问题。您似乎正在使用默认的标准分析器,它在索引时进行词法分析时会破坏带有特殊字符的单词。在查询时,此词法分析适用于常规查询,而不适用于通配符搜索查询。因此,根据您的示例,您有< 1003>在搜索索引和通配符搜索查询中,没有以相同的方式标记,并查找以abc-1003开头的条款找不到它,因为索引中的条件都不以abc-1003开头。希望这是有道理的。如果您有任何其他问题,请与我们联系。
内特
答案 2 :(得分:0)
documentation说连字符“ -
”被视为特殊字符,必须转义。
实际上,连字符被视为令牌的拆分,并且搜索两侧的单词,如Sean Saleh pointed out。
经过一番调查,我发现您不需要自定义分析器,内置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
不要忘记在请求标头中包含api-key
。
您还可以通过analyzer test endpoint测试此分析仪和其他分析仪:
{
"text": "Text to analyze",
"analyzer": "whitespace"
}