如何使用字母数字字符和破折号索引字段以进行通配符搜索
How to index a field with alphanumeric characters AND a dash for wildcard search
给定一个看起来像这样的模型:
{
[Key]
public string Id { get; set; }
[IsSearchable]
[Analyzer(AnalyzerName.AsString.Keyword)]
public string AccountId { get; set; }
}
AccountId 的示例数据如下所示:
1-ABC123
1-333444555
1-A4KK498
该字段可以是 letters/digits 和中间破折号的任意组合。
我需要能够使用 1-ABC* 等查询来搜索此字段。然而,none 的基本分析器似乎支持破折号,但关键字除外,它不接受任何通配符查询,仅完全匹配。我看过其他一些关于自定义分析器的文章,但我无法获得足够的信息来了解如何构建它来解决这个问题。
我需要知道我是否必须为这个领域构建客户分析器,我是否需要不同的搜索分析器和索引分析器?
我将 StandardLucene 用于其他不带破折号的字母数字字段,我还有另一个带破折号的字段,但它都是数字,关键字在那里工作得很好。问题似乎出在字母和数字的混合上。
自定义分析器确实是解决问题的方法。
基本上,您可以定义一个自定义分析器,该分析器使用带有“小写”标记过滤器的“关键字”标记器。
将自定义分析器添加到索引 class,并更改模型中的分析器名称以匹配自定义分析器名称:
new Index()
{
...
Analyzers = new[]
{
new CustomAnalyzer()
{
Name = "keyword_lowercase",
Tokenizer = TokenizerName.Keyword,
TokenFilters = new[] { TokenFilterName.Lowercase }
}
}
}
型号:
{
[Key]
public string Id { get; set; }
[IsSearchable]
[Analyzer("keyword_lowercase")]
public string AccountId { get; set; }
}
在 REST API 中看起来像这样:
{
"fields": [{
"name": "Id",
"type": "Edm.String",
"key": true
},
{
"name": "AccountId",
"type": "Edm.String",
"searchable": true,
"retrievable": true,
"analyzer": "keyword_lowercase"
}],
"analyzers":[
{
"name":"keyword_lowercase",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer":"keyword_v2",
"tokenFilters":["lowercase"]
}
]
}
给定一个看起来像这样的模型:
{
[Key]
public string Id { get; set; }
[IsSearchable]
[Analyzer(AnalyzerName.AsString.Keyword)]
public string AccountId { get; set; }
}
AccountId 的示例数据如下所示:
1-ABC123
1-333444555
1-A4KK498
该字段可以是 letters/digits 和中间破折号的任意组合。
我需要能够使用 1-ABC* 等查询来搜索此字段。然而,none 的基本分析器似乎支持破折号,但关键字除外,它不接受任何通配符查询,仅完全匹配。我看过其他一些关于自定义分析器的文章,但我无法获得足够的信息来了解如何构建它来解决这个问题。
我需要知道我是否必须为这个领域构建客户分析器,我是否需要不同的搜索分析器和索引分析器?
我将 StandardLucene 用于其他不带破折号的字母数字字段,我还有另一个带破折号的字段,但它都是数字,关键字在那里工作得很好。问题似乎出在字母和数字的混合上。
自定义分析器确实是解决问题的方法。 基本上,您可以定义一个自定义分析器,该分析器使用带有“小写”标记过滤器的“关键字”标记器。
将自定义分析器添加到索引 class,并更改模型中的分析器名称以匹配自定义分析器名称:
new Index()
{
...
Analyzers = new[]
{
new CustomAnalyzer()
{
Name = "keyword_lowercase",
Tokenizer = TokenizerName.Keyword,
TokenFilters = new[] { TokenFilterName.Lowercase }
}
}
}
型号:
{
[Key]
public string Id { get; set; }
[IsSearchable]
[Analyzer("keyword_lowercase")]
public string AccountId { get; set; }
}
在 REST API 中看起来像这样:
{
"fields": [{
"name": "Id",
"type": "Edm.String",
"key": true
},
{
"name": "AccountId",
"type": "Edm.String",
"searchable": true,
"retrievable": true,
"analyzer": "keyword_lowercase"
}],
"analyzers":[
{
"name":"keyword_lowercase",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer":"keyword_v2",
"tokenFilters":["lowercase"]
}
]
}