首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AzureSearch edgeNGram搜索匹配的文档太多

AzureSearch edgeNGram搜索匹配的文档太多
EN

Stack Overflow用户
提问于 2021-07-01 20:25:20
回答 2查看 52关注 0票数 0

我正在尝试使用边缘ngram分析器分析的字段来实现前缀搜索。然而,每当我进行搜索时,它都会返回类似的匹配,但不包含搜索到的术语。

以下查询

代码语言:javascript
复制
POST /indexes/resources/docs/search?api-version=2020-06-30

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

返回

代码语言:javascript
复制
{
"@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“标记化如下

代码语言:javascript
复制
"@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
    }
]
}

如何排除与该术语不完全匹配的文档?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-01 21:46:54

我想出了问题所在:

我创建了一个带有“分析器”属性的字段,该属性引用我的自定义分析器("edge_nGram_analyzer")。设置此字段意味着字符串在索引和搜索时都是标记化的。因此,搜索"7024032“意味着我正在搜索所有的标记,根据egde n元语法分析器划分:"7”、"70“、"702”、"7024“、"7024032”、"70240“、"702403”、"7024032“。

可以使用indexAnalyzer和searchAnalyzer属性来处理索引标记化和搜索标记化。当我单独使用它们时:

代码语言:javascript
复制
{ "indexAnalyzer": "edge_nGram_analyzer", "searchAnalyzer": "whitespace" }

一切都按预期进行了。

票数 0
EN

Stack Overflow用户

发布于 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+/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68210158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档