Массив полей предложения

У меня есть документ, содержащий массив тегов. Мне нужно создать поле предложения, соответствующее этому полю тега (чтобы генерировать предложения тегов на основе значений в массиве тегов). Я использую NEST в основном для взаимодействия с эластичным поиском. Но я не могу обновить свойство предложения. Класс, используемый для документа, содержит следующую структуру документа:

public class SuggestField
{
    public IEnumerable<string> Input { get; set; }
    public string Output { get; set; }
    public object Payload { get; set; }
    public int? Weight { get; set; }
}


public class Source{

        [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
        public string[] tags { get; set; }

        public SuggestField[] tag_suggest { get; set; }
}

Я добавляю сопоставление следующим образом:

var response = client.Map<Source>(m => m
                                     .MapFromAttributes()
                                     .Properties(p => p
                                     .Completion(c => c
                                     .Name(cp => cp.tag_suggest)
                                         .Payloads()
                                     )));

Для обновления тегов я использую внешние скрипты. Я надеялся изменить этот же скрипт, чтобы добавить изменения в поле tag_suggest. Но я пробовал следующее, но это не работает. Ниже приведен сценарий, который я пробовал:

if (ctx._source.tags.indexOf(newTag) < 0) {
      ctx._source.tags[ctx._source.tags.length] = newTag;
      ctx._source.tag_suggest[ctx._source.tag_suggest.length] = { input :newTag }
}

person labyrinth    schedule 24.09.2015    source источник


Ответы (1)


Я бы изменил тип свойства tag_suggest с SuggestField[] на SuggestField. Вы можете хранить все теги в SuggestField.Input.

public class Source
{

    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
    public string[] tags { get; set; }

    public SuggestField tag_suggest { get; set; }
}

Что касается вашего сценария обновления, после этого изменения вы можете изменить его на:

if (ctx._source.tags.indexOf(newTag) < 0) {
      ctx._source.tags[ctx._source.tags.length] = newTag;
      ctx._source.tag_suggest.input[ctx._source.tag_suggest.length] = newTag;
}

Надеюсь, поможет.

person Rob    schedule 25.09.2015
comment
Да! Спасибо :) - person labyrinth; 25.09.2015