Автозаполнение поиска Azure с помощью специальных символов Escape - PullRequest
0 голосов
/ 15 октября 2019

У меня проблемы с включением специальных символов, таких как -, @, # и других, в ответ на автозаполнение.

Я использую .Net Core с C # и пакет Microsoft.Azure.Search.

Я новичок в Поиске 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;
}

Мой ожидаемый результат будет pyh2982@gmail.com для поля Имя, когда я передам pyh в тексте. Тем не менее, фактический результат - просто pyh2982 gmail.com, с отсутствующим @ inbetween.

Я немного исследовал работу с Analyzer, но меня смущает вопрос о том, какой анализатор мне следует выбрать.

Любая помощь приветствуется! Спасибо!

1 Ответ

0 голосов
/ 15 октября 2019

Анализатор - это фрагмент кода, отвечающий за токенизацию и индексацию вашего контента. Стандартный анализатор преобразует текст в нижний регистр и разбивает каждое слово остановки. Насколько я знаю, он должен индексировать вашу электронную почту как один кусок. Вы можете выполнить тест и выполнить автозаполнение без символа «@» и «-». Например: pyh2982 gmail com и проверьте, работает ли он для вас.

PS: Если вы используете режим Lucene (queryType = full), то вам следует избегать специальных символов. Пожалуйста, проверьте: https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax

...