我正在尝试使用边缘ngram分析器分析的字段来实现前缀搜索。然而,每当我进行搜索时,它都会返回类似的匹配,但不包含搜索到的术语。
以下查询
POST /indexes/resources/docs/search?api-version=2020-06-30
{
"queryType": "full",
"searchMode": "all",
"search": "short_text_prefix:7024032"
}返回
{
"@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
}
]
}如何排除与该术语不完全匹配的文档?
发布于 2021-07-01 21:46:54
我想出了问题所在:
我创建了一个带有“分析器”属性的字段,该属性引用我的自定义分析器("edge_nGram_analyzer")。设置此字段意味着字符串在索引和搜索时都是标记化的。因此,搜索"7024032“意味着我正在搜索所有的标记,根据egde n元语法分析器划分:"7”、"70“、"702”、"7024“、"7024032”、"70240“、"702403”、"7024032“。
可以使用indexAnalyzer和searchAnalyzer属性来处理索引标记化和搜索标记化。当我单独使用它们时:
{ "indexAnalyzer": "edge_nGram_analyzer", "searchAnalyzer": "whitespace" }一切都按预期进行了。
发布于 2021-07-01 20:53:24
在这种情况下,Ngram不是正确的方式,因为前缀“702403”出现在所有这些文档中。如果您将最小长度指定为要搜索的术语的长度,则可以使用它。
下面是一个例子:
token长度:3
示例内容:
234
1234
2345
3456
001234
99234345
搜索“234”
它将返回项目1 (234)、2 (1234)、3 (2345)、4 (001234)和5 (99234345)
另一种选择是,如果你是100%的内容以你所呈现的方式存储,你可以使用正则表达式来检索你想要的方式:
/.*7024032\s+/

https://stackoverflow.com/questions/68210158
复制相似问题