Отличительные значения в предложениях поиска Azure?

Я выгружаю свою функцию поиска по реляционной базе данных в Поиск Azure. Таблицы My Products содержат столбцы, такие как serialNumber, PartNumber и т. Д. (Может быть несколько serialNumbers с одним и тем же partNumber).

Я хочу создать подсказку, которая может автоматически заполнять номера деталей. Но в моем сценарии я получаю много дубликатов в предложениях, потому что совпадение partNumber было найдено в нескольких записях.

Как я могу решить эту проблему?

2 ответа

Решение

API Suggest предлагает документы, а не запросы. Если вы повторите информацию partNumber для каждого serialNumber в вашем индексе, а затем предложите на основе partNumber, вы получите результат для каждого соответствующего документа. Вы можете увидеть это более четко, включив ключевое поле в параметр $select. Поиск Azure удалит дубликаты в одном документе, но не в других документах. Вам придется сделать это на стороне клиента или создать вторичный индекс partNumbers только для предложений.

Смотрите эту ветку форума для более глубокого обсуждения.

Кроме того, не стесняйтесь голосовать за этот пункт UserVoice, чтобы помочь нам расставить приоритеты по улучшению предложений.

Я сам сталкиваюсь с этой проблемой. Мое решение не включает новый индекс (это только запутает и будет стоить нам денег).

Я полагаю, что это цикл while, добавляющий UserIdentity (в вашем случае 'partNumber') в фильтр, и повторный поиск до тех пор, пока не будет достигнут мой take/top-limit или больше не будет предложений:

public async Task<List<MachineSuggestionDTO>> SuggestMachineUser(string searchText, int take, string[] searchFields)
{
    var indexClientMachine = _searchServiceClient.Indexes.GetClient(INDEX_MACHINE);
    var suggestions = new List<MachineSuggestionDTO>();

    var sp = new SuggestParameters
    {
        UseFuzzyMatching = true,
        Top = 100 // Get maximum result for a chance to reduce search calls.
    };

    // Add searchfields if set
    if (searchFields != null && searchFields.Count() != 0)
    {
        sp.SearchFields = searchFields;
    }

    // Loop until you get the desired ammount of suggestions, or if under desired ammount, the maximum.
    while (suggestions.Count < take)
    {
        if (!await DistinctSuggestMachineUser(searchText, take, searchFields, suggestions, indexClientMachine, sp))
        {
            // If no more suggestions is found, we break the while-loop
            break;
        }
    }

    // Since the list might me bigger then the take, we return a narrowed list
    return suggestions.Take(take).ToList();
}

private async Task<bool> DistinctSuggestMachineUser(string searchText, int take, string[] searchFields, List<MachineSuggestionDTO> suggestions, ISearchIndexClient indexClientMachine, SuggestParameters sp)
{
    var response = await indexClientMachine.Documents.SuggestAsync<MachineSearchDocument>(searchText, SUGGESTION_MACHINE, sp);

    if(response.Results.Count > 0){
        // Fix filter if search is triggered once more
        if (!string.IsNullOrEmpty(sp.Filter))
        {
            sp.Filter += " and ";
        }

        foreach (var result in response.Results.DistinctBy(r => new { r.Document.UserIdentity, r.Document.UserName, r.Document.UserCode}).Take(take))
        {
            var d = result.Document;
            suggestions.Add(new MachineSuggestionDTO { Id = d.UserIdentity, Namn = d.UserNamn, Hkod = d.UserHkod, Intnr = d.UserIntnr });

            // Add found UserIdentity to filter
            sp.Filter += $"UserIdentity ne '{d.UserIdentity}' and ";
        }


        // Remove end of filter if it is run once more
        if (sp.Filter.EndsWith(" and "))
        {
            sp.Filter = sp.Filter.Substring(0, sp.Filter.LastIndexOf(" and ", StringComparison.Ordinal));
        }
    }            

    // Returns false if no more suggestions is found
    return response.Results.Count > 0;
}

Вы можете использовать API автозаполнения для того, где группировка по умолчанию. Однако, если вам нужно больше полей вместе с результатом, например, partNo плюс описание, оно его не поддерживает. Номер детали будет отличаться.

 public async Task<List<string>> SuggestionsAsync(bool highlights, bool fuzzy, string term)
    {
        SuggestParameters sp = new SuggestParameters()
        {
            UseFuzzyMatching = fuzzy,
            Top = 100
        };

        if (highlights)
        {
            sp.HighlightPreTag = "<em>";
            sp.HighlightPostTag = "</em>";
        }

        var suggestResult = await searchConfig.IndexClient.Documents.SuggestAsync(term, "mysuggestion", sp);

        // Convert the suggest query results to a list that can be displayed in the client.
        return suggestResult.Results.Select(x => x.Text).Distinct().Take(10).ToList();
    }

После того, как я попал в топ-100 и использовал отличные возможности, он работал у меня.

Другие вопросы по тегам