AzureSearch edgeNGram 搜索匹配太多文档

AzureSearch edgeNGram search matching too many documents

我正在尝试使用边缘 ngram 分析器分析的字段来实施前缀搜索。 但是,每当我进行搜索时,它都会 returns 相似的匹配项,但不包含搜索的字词。

以下查询

POST /indexes/resources/docs/search?api-version=2020-06-30

{
"queryType": "full",
"searchMode": "all",
"search": "short_text_prefix:7024032"
}

Returns

{
"@odata.context": ".../indexes('resources')/$metadata#docs(*)",
"@search.nextPageParameters": {
    "queryType": "full",
    "searchMode": "all",
    "search": "short_text_prefix:7024032",
    "skip": 50
},
"value": [
    {
    "@search.score": 4.669537,
    "short_text_prefix": "7024032   "
    },
    {
    "@search.score": 4.6333756,
    "short_text_prefix": "7024030   "
    },
    {
    "@search.score": 4.6333756,
    "short_text_prefix": "7024034   "
    },
    {
    "@search.score": 4.6333756,
    "short_text_prefix": "7024031   "
    },
    {
    "@search.score": 4.6319494,
    "short_text_prefix": "7024033   "
    },
    ... omitted for brevity ...
],
"@odata.nextLink": ".../indexes('resources')/docs/search.post.search?api-version=2020-06-30"
}

其中包括一堆与我的术语几乎匹配的文档。得分最高的“正确”文档在上面。

自定义分析器像这样标记“7024032”

"@odata.context": "/$metadata#Microsoft.Azure.Search.V2020_06_30.AnalyzeResult",
"tokens": [
    {
    "token": "7",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "70",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "702",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "7024",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "70240",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "702403",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    },
    {
    "token": "7024032",
    "startOffset": 0,
    "endOffset": 7,
    "position": 0
    }
]
}

如何排除与词条不完全匹配的文档?

在这种情况下,Ngram 不是正确的方法,因为前缀“702403”出现在所有这些文档中。如果您将最小长度指定为要搜索的术语的长度,则可以使用它。

这是一个例子:

令牌长度:3

示例内容:

234

1234

2345

3456

001234

99234345

正在搜索“234”

它将 return 项目 1 (234)、2 (1234)、3 (2345)、4 (001234) 和 5 (99234345)

另一种选择,如果您 100% 以您呈现的方式存储内容,您可以使用正则表达式以您想要的方式检索:

/.*[=​​41=]+/

我发现问题了:

我创建了带有“分析器”属性 的字段,指的是我的自定义分析器(“edge_nGram_analyzer”)。设置此字段意味着字符串在索引和搜索时都被标记化。所以搜索“7024032”意味着我正在搜索所有标记,根据 egde n-gram 分析器拆分:“7”、“70”、“702”、“7024”、“7024032”、“70240”、“702403” ", "7024032"

可以改为使用 indexAnalyzer 和 searchAnalyzer 属性,将索引标记化与搜索标记化分开处理。当我分别使用它们时:

{ "indexAnalyzer": "edge_nGram_analyzer", "searchAnalyzer": "whitespace" }

一切如预期。