0

我们已将文档存储到 azure search 中。其中一份文件具有以下字段值。

“标题”:“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', 'any')

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

$filter=search.ismatch('"shader_invocations*"','Title', 'full', 'any')

但是,如果我包含带有 (.) 点字符的文本,则相同的过滤器将起作用。

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

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

因此,下面的过滤器将不起作用,因为文档中存在 (.) 点字符,就在查询中使用的搜索词之前和之后。在我们的例子中,Azure 搜索文档中的单词“compute”之前和单词“invocations”之后都有一个点字符。

$filter=search.ismatch('"compute_shader_invocations*"','Title', 'full', 'any')

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

$filter=search.ismatch('"shader_invocations*"','Title', 'full', 'any')

但是下面的过滤器应该可以工作,因为在 Azure 搜索文档中“查询”一词之前或“着色器”一词之后没有点字符

$filter=search.ismatch('"query.compute_shader*"','Title', 'full', 'any') $filter=search.ismatch('"shader*"','Title', 'full', '任何')

这真让我抓狂。任何帮助将不胜感激。

4

1 回答 1

2

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

详细解答

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

  1. 通配符查询*
  2. 非通配符查询(例如"compute_shader"

通常,您发出的非通配符查询将进行与索引中任何自定义分析器定义的相同的分析。在通配符查询的情况下,不执行任何分析。

现在以您的文档文本为例"statistics_query.compute_shader_invocations.secondary_inherited failed",您定义的自定义分析器会将其分解为标记。(仅供参考:您可以使用分析 API查看细分)。

以下通配符查询成功

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

因为,当您在源文档上运行分析时,会有“着色器”之类的标记

以下通配符查询不成功

$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 个异常情况。我将不胜感激有关这些的一些澄清。

此外,一般而言,有关 Azure 搜索中的全文搜索如何工作的文档是深入了解我提到的某些内容的好地方。

于 2018-02-23T20:50:26.513 回答