我有一个复杂的标识符字段,其中包含字母、数字、空格和特殊字符。我一直在该领域使用关键字分析器,但在过滤结果时遇到问题。以下是该字段将包含的示例数据:
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
}
答案 0 :(得分:0)
在您的示例中,值 O-2011-006953 /4
与正则表达式 /.O./
不匹配,因为正则表达式要求在“O”之前有一个字符(“.”表示“该位置正好有 1 个字符” )。如果要匹配标记中任何位置的子字符串,可以使用 /.*O.*/
,其中“O”是子字符串“.”。表示“任何字符”,“*”表示“前一个元素的零个或多个,在本例中为“.”。
请注意,这种类型的正则表达式搜索可能很慢,并且不能保证完全召回(即我们可能不会返回可能与正则表达式匹配的所有文档,我们限制从正则表达式中扩展的术语数)。