AzureSearch edgeNGram 搜索匹配太多文档

问题描述

我正在尝试使用边缘 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","search": "short_text_prefix:7024032","skip": 50
},"value": [
    {
    "@search.score": 4.669537,"short_text_prefix": "7024032   "
    },{
    "@search.score": 4.6333756,"short_text_prefix": "7024030   "
    },"short_text_prefix": "7024034   "
    },"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",{
    "token": "702",{
    "token": "7024",{
    "token": "70240",{
    "token": "702403",{
    "token": "7024032","position": 0
    }
]
}

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

解决方法

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

这是一个例子:

令牌长度:3

示例内容:

234

1234

2345

3456

001234

99234345

搜索“234”

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

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

/.*7024032\s+/

enter image description here

,

我发现了问题:

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

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

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

一切都按预期进行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...