Azure搜索未返回正确的结果。 (点)在搜索查询中

时间:2018-02-23 06:27:32

标签: azure azure-search azure-search-.net-sdk

我们已将文档存储到azure搜索中。其中一个文件的字段值低于字段值。

" Title":" statistics_query.compute_shader_invocations.secondary_inherited失败"

我们已根据MS Azure团队的建议在其上定义了自定义分析器,以解决由于_(下划线)而遇到的问题之一。

{
  "name": "myindex",
  "fields": [
        {
            "name": "id",
            "type": "Edm.String",
            "searchable": true,
            "filterable": true,
            "retrievable": true,
            "sortable": false,
            "facetable": false,
            "key": true,
            "indexAnalyzer": null,
            "searchAnalyzer": null,
            "analyzer": null
        },
        {
            "name": "Title",
            "type": "Edm.String",
            "searchable": true,
            "filterable": true,
            "retrievable": true,
            "sortable": true,
            "facetable": true,
            "key": false,
            "indexAnalyzer": null,
            "searchAnalyzer": null,
            "analyzer": "remove_underscore"
        }
],
  "analyzers": [
    {
      "name": "remove_underscore",
      "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
      "charFilters": [
        "remove_underscore"
      ],
      "tokenizer": "standard_v2"
    }
  ],
  "charFilters": [
    {
      "name": "remove_underscore",
      "@odata.type": "#Microsoft.Azure.Search.MappingCharFilter",
      "mappings": [
        "_=>-"
      ]
    }
  ]
}

但是,当我在我的天蓝色搜索索引(版本号为2016-09-01预览版)上搜索下面的过滤器时,我没有得到任何结果。

$ filter = search.ismatch('" compute_shader_invocations *"',' Title',' full',&#39 ;任何&#39)

$ filter = search.ismatch('" compute_shader_invocations"'' Title',' full',' any& #39)

$ filter = search.ismatch('" shader_invocations *"',' Title',' full',&#39 ;任何&#39)

但是,如果我用(。)点字符包含文本,则相同的过滤器可以正常工作。

$ filter = search.ismatch('" query.compute_shader *"',' Title',' full',& #39;任何&#39)

根据我的测试,如果文档在过滤器中使用的搜索词之后或之前有一个点(。)字符,则搜索不会返回结果。

因此,下面的过滤器不会起作用,因为文档中存在(。)点字符,就在查询中使用的搜索词之前和之后。在我们的例子中,在单词" compute"之前存在一个点字符。并在#34; invocations"之后在Azure搜索文档中。

$ filter = search.ismatch('" compute_shader_invocations *"',' Title',' full',&#39 ;任何&#39)

$ filter = search.ismatch('" compute_shader"',' Title',' full',' any& #39)

$ filter = search.ismatch('" shader_invocations *"',' Title',' full',&#39 ;任何&#39)

然而,下面的过滤器应该可以工作,因为在单词" query"之前没有点字符。或者在#34; shadder"之后在Azure搜索文档中

$ filter = search.ismatch('" query.compute_shader *"',' Title',' full',& #39;任何') $ filter = search.ismatch('"着色器*"','标题','完整','任何&# 39)

这让我发疯了。任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

tl; dr 通配符查询没有执行自定义分析。非通配符查询应返回结果,因此请仔细检查

详细答案

因此,点(。)实际上与您正在观察的行为没有任何关系。您要发布两类搜索查询:

  1. 通配符查询*
  2. 非通配符查询(例如“compute_shader”
  3. 通常,您发出的非通配符查询将进行与索引中任何自定义分析器定义的分析相同的分析。在通配符查询的情况下,不执行分析。

    现在以文档文本为例“statistics_query.compute_shader_invocations.secondary_inherited失败”,您定义的自定义分析器会将其分解为令牌。 (仅供参考:您可以使用Analyze API查看细分)。

    以下通配符查询成功

      

    $ filter = search.ismatch('“shader *”','Title','full','any')

    因为,当您对源文档运行分析时,会出现像“shader”

    这样的标记

    以下通配符查询失败

      

    $ filter = search.ismatch('“compute_shader_invocations *”','Title','full','any')   $ filter = search.ismatch('“shader_invocations *”','Title','full','any')

    因为使用自定义分析器分析源文档时,没有像“computer_shader_invocations”“shader_invocations”这样的令牌。

    这个也不应该成功,但有趣的是你说它确实如此:

      

    $ filter = search.ismatch('“query.compute_shader *”','Title','full','any')

    现在让我们关注没有通配符的查询。

      

    $ filter = search.ismatch('“compute_shader_invocations”','Title','full','any')   $ filter = search.ismatch('“compute_shader”','Title','full','any')

    这些应该在技术上使用自定义分析器正确地进行标记化,并且应该具有匹配的结果。

    您能否先验证原始问题中最后3个突出显示的实例中的查询是否正确?当我尝试创建示例索引并根据您的配置发出搜索请求时,这些是我注意到的3个异常。我希望对这些做一些澄清。

    此外,一般来说,documentation围绕Azure搜索中的全文搜索工作是一个很好的地方,可以深入了解我提到的一些事情。