[英]How to allow wildcards for custom analyzer in Azure Search
提前感谢您的帮助。
我正在使用 Azure Search.Net SDK 来构建索引器。 我目前也在使用自定义分析器
在使用自定义分析器之前,我使用的是 EnLucene 分析器,它允许我使用通配符搜索 *. 比如我是用来让用户搜索后缀搜索的。 如果用户搜索“app”,它会返回“apple, application, approach”等结果。 请不要建议自动完成或建议,因为建议器不能与自定义分析器一起使用。 我不想仅仅因为建议者而创建额外的 20 个搜索字段。 (一个用于建议者,一个用于搜索)。
下面是我的自定义分析器示例。 它不允许我使用 * 进行部分匹配。 我不是在寻找任何前缀或后缀部分匹配的 NGram 解决方案。 我实际上想使用通配符 *. 我该怎么做才能允许通配符搜索?
var definition = new Index()
{
Name = indexName,
Fields = mapFields,
Analyzers = new[]
{
new CustomAnalyzer
{
Name = "custom_analyzer",
Tokenizer = TokenizerName.Whitespace,
TokenFilters = new[]
{
TokenFilterName.AsciiFolding,
TokenFilterName.Lowercase,
TokenFilterName.Phonetic
}
}
}
};
您可以这样做:
{ "name":"names", "fields":[ { "name":"id", "type":"Edm.String", "key":true, "searchable":false }, { "name":"name", "type":"Edm.String", "analyzer":"my_standard" } ], "analyzers":[ { "name":"my_standard", "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer", "tokenizer":"standard", "tokenFilters":[ "lowercase", "asciifolding" ] } ] } // Below snippet is for creating definition using c# new CustomAnalyzer { Name = "custom_analyzer", Tokenizer = TokenizerName.Standard, TokenFilters = new[] { TokenFilterName.Lowercase, TokenFilterName.AsciiFolding, TokenFilterName.Phonetic } }
[IsSearchable, IsFilterable, IsSortable, Analyzer("custom_analyzer")] public string Property { get; set; }
查看此博客以获取更多参考:
https://azure.microsoft.com/en-in/blog/custom-analyzers-in-azure-search/
以下是定制分析仪的示例测试方法:
[Fact]
public void CanSearchWithCustomAnalyzer()
{
Run(() =>
{
const string CustomAnalyzerName = "my_email_analyzer";
const string CustomCharFilterName = "my_email_filter";
Index index = new Index()
{
Name = SearchTestUtilities.GenerateName(),
Fields = new[]
{
new Field("id", DataType.String) { IsKey = true },
new Field("message", (AnalyzerName)CustomAnalyzerName) { IsSearchable = true }
},
Analyzers = new[]
{
new CustomAnalyzer()
{
Name = CustomAnalyzerName,
Tokenizer = TokenizerName.Standard,
CharFilters = new[] { (CharFilterName)CustomCharFilterName }
}
},
CharFilters = new[] { new PatternReplaceCharFilter(CustomCharFilterName, "@", "_") }
};
Data.GetSearchServiceClient().Indexes.Create(index);
SearchIndexClient indexClient = Data.GetSearchIndexClient(index.Name);
var documents = new[]
{
new Document() { { "id", "1" }, { "message", "My email is someone@somewhere.something." } },
new Document() { { "id", "2" }, { "message", "His email is someone@nowhere.nothing." } },
};
indexClient.Documents.Index(IndexBatch.Upload(documents));
SearchTestUtilities.WaitForIndexing();
DocumentSearchResult<Document> result = indexClient.Documents.Search("someone@somewhere.something");
Assert.Equal("1", result.Results.Single().Document["id"]);
});
}
随时在您的对话中标记我,希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.