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" }
一切如预期。
我正在尝试使用边缘 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" }
一切如预期。