【问题标题】:Azure Search Autocomplete with Escape Special Characters带有转义特殊字符的 Azure 搜索自动完成
【发布时间】:2020-02-11 15:42:06
【问题描述】:

我在自动完成响应中包含特殊字符(例如 -、@、# 等)时遇到问题。

我正在使用带有 C# 和 Microsoft.Azure.Search 包的 .Net Core。

我是 Azure 搜索的新手,所以请慷慨地为我提供详细的解释和一些指导。

到目前为止,我已经创建了一个索引,其字段为如下所示。

private async Task StartIndexAsync(bool resetIndexer = true)
{
    await CreateIndexAsync(new[]{
            new Field(nameof(ProjectSearchModel.Id),                      DataType.String)     { IsKey = true,  IsSearchable = false, IsFilterable = false, IsSortable = false, IsFacetable = false, IsRetrievable = true},
            new Field(nameof(ProjectSearchModel.Name),                    DataType.String)     { IsKey = false,  IsSearchable = false, IsFilterable = false, IsSortable = false, IsFacetable = false, IsRetrievable = true},
            new Field(nameof(ProjectSearchModel.Number),                  DataType.String)     { IsKey = false,  IsSearchable = false, IsFilterable = false, IsSortable = false, IsFacetable = false, IsRetrievable = true}
            },
        new[] {
            nameof(ProjectSearchModel.Name),
            nameof(ProjectSearchModel.Number),
        });

    await CreateDatasourceAsync();
    await StartIndexerAsync(resetIndexer);
}
internal async Task CreateIndexAsync(string indexName, IList<Field> mapFields, IList<string> sugFields)
{
    // Create the Azure Search index based on the included schema
    try
    {
        var definition = new Index()
        {
            Name = indexName,
            Fields = mapFields,
            Suggesters = new List<Suggester>() {new Suggester()
            {
                Name = "sg",
                SourceFields = sugFields,
            }}
        };

        await _searchClient.Indexes.CreateOrUpdateAsync(definition);
    }
    catch (Exception ex)
    {
        _logger.LogError("Error creating index: {0}\r\n", ex.Message);
    }
}

通过此索引设置,我使用以下函数调用自动完成功能。

public override async Task<AutocompleteResult> AutocompleteAsync(int take, string text)
{
    // Setup the suggest parameters.
    var parameters = new AutocompleteParameters()
    {
        SearchFields = new [] { "Name", "Number"},
        AutocompleteMode = AutocompleteMode.TwoTerms,
        UseFuzzyMatching = true,
        Top = take
    };
    var completeResult = await base.AutocompleteAsync(parameters, text);
    return completeResult;
}

当我在文本中传递 pyh 时,我的预期结果将是 pyh2982@gmail.com 的名称字段。但是,实际结果只是 pyh2982 gmail.com,中间缺少@。

我对 Analyzer 进行了一些研究,但对于我应该选择哪种分析器感到困惑。

感谢任何帮助!谢谢!

【问题讨论】:

    标签: azure special-characters msdn azure-cognitive-search analyzer


    【解决方案1】:

    分析器是一段代码,负责对您的内容进行标记和索引。标准分析器将文本转换为小写,并在每个停用词上打断。据我所知,它应该将您的电子邮件作为一个单独的部分进行索引。您可以在没有“@”符号和“-”的情况下进行测试并执行自动完成。例如:pyh2982 gmail com 并检查它是否适合您。

    PS:如果您使用的是 Lucene 模式(queryType=full),那么您应该转义特殊字符。请查收:https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax

    【讨论】:

    • 好的,问题是如果我想使用自动完成,那么我需要将该特定字段添加到建议者。 Azure 搜索不允许我为建议器中包含的任何字段更改默认分析器以外的分析器。当我尝试这样做时,我收到一条错误消息,提示“请求无效。详细信息:定义:在建议者 'sg' 中的字段 'UpdatedBy/Email' 使用不受支持的分析器配置。建议器仅支持默认分析器和语言此版本 API 中的分析器”。标准分析器会破坏@等特殊字符。
    • “解决方法”是将“@”替换为“||”例如,然后在将文本发送到自动完成之前执行相同的操作。我想不出别的办法
    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多