Azure 搜索分析器/过滤器问题

时间:2021-06-17 20:03:32

标签: azure-cognitive-search azure-search-.net-sdk

我有一个复杂的标识符字段,其中包含字母、数字、空格和特殊字符。我一直在该领域使用关键字分析器,但在过滤结果时遇到问题。以下是该字段将包含的示例数据:

O-2011-006953 /4

使用关键字分析器后,我可以使用数字而不是字母对索引字段进行包含过滤器。以下过滤器有效:

search.ismatch('/.*2011.*/', 'complex_identifier_field', 'full', 'all')

但是如果我尝试使用一个字母进行包含搜索,我会得到 0 个结果:

search.ismatch('/.*O.*/', 'complex_identifier_field', 'full', 'all')

我相信我的问题是我需要另一个或自定义分析器,我最近尝试使用 NGram 分析器,并尝试使用关键字标记器编写自定义分析器,但仍然无法在该字段上进行包含搜索。我如何创建一个作为一个令牌的字段;接受字母数字字符、空格和特殊字符;并允许我做一个包含过滤器来查找标识符字段的任何部分?

更新

这里是字段的定义:

new Field("accession_number", DataType.String){ IsSearchable= true, IsFilterable = true, Analyzer = AnalyzerName.Keyword },

这是我正在使用的确切搜索:

var result = indexClient.Documents.Search(query, searchParameters: parameters);

where query = "print" and parameters =

{
Facets = null,
Filter = search.ismatch('/.*O.*/', 'accession_number', 'full', 'all'),
HighlightFields = null,
HighlightPostTag = null,
HighlightPreTag = null,
IncludeTotalResultsCount = true,
MinimumCoverage = null,
OrderBy = null,
QueryType = Full,
ScoringParameters = null,
ScoringProfile = null,
SearchFields = null,
SearchMode = All,
Select = (9 fields),
Skip = 0,
Top = 50
}

1 个答案:

答案 0 :(得分:0)

在您的示例中,值 O-2011-006953 /4 与正则表达式 /.O./ 不匹配,因为正则表达式要求在“O”之前有一个字符(“.”表示“该位置正好有 1 个字符” )。如果要匹配标记中任何位置的子字符串,可以使用 /.*O.*/,其中“O”是子字符串“.”。表示“任何字符”,“*”表示“前一个元素的零个或多个,在本例中为“.”。

请注意,这种类型的正则表达式搜索可能很慢,并且不能保证完全召回(即我们可能不会返回可能与正则表达式匹配的所有文档,我们限制从正则表达式中扩展的术语数)。