Azure搜索和破折号

时间:2016-06-02 20:55:40

标签: azure azure-search

我正在使用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搜索的错误吗?

3 个答案:

答案 0 :(得分:3)

首先,没有以空格开头的破折号就像破折号,而不是否定操作符。

根据simple query syntax

的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"
}