2014-11-19 2 views
0

Я пытаюсь реализовать search.FieldLoadSaver интерфейс, чтобы иметь возможность выбирать язык поля.Appengine язык поиска

func (p *Product) Save() ([]search.Field, error) { 
    var fields []search.Field 

    // Add product.ID 
    fields = append(fields, search.Field{Name: "ID", Value: search.Atom(p.ID)}) 

    // Add product.Name 
    fields = append(fields, search.Field{Name: "Name", Value: p.Name, Language: "en"}) 

    return fields, nil 
} 

И я получаю эту ошибку: errors.errorString {ы: «Поиск: INVALID_REQUEST:.. Недействительный язык Языки должны быть две буквы»}

кажется, что питон devserver обрабатывает пустое поле языка как ошибка.

EDIT: проблема заключалась в том, что я помещал несколько полей с тем же именем и языком установки, чтобы быть пустым. Похоже, что это недопустимо, поэтому, когда вы используете несколько полей с тем же именем, убедитесь, что вы также ставите язык.

ответ

1

Я не уверен, что именно ваш вопрос, но here вы можете видеть, что то, что вы думаете (кажется, что питон devserver обрабатывает пустое поле языка как ошибка.) не соответствует действительности.

Фрагмент кода из этой документации

type Field struct { 
    // Name is the field name. A valid field name matches /[A-Z][A-Za-z0-9_]*/. 
    // A field name cannot be longer than 500 characters. 
    Name string 
    // Value is the field value. The valid types are: 
    // - string, 
    // - search.Atom, 
    // - search.HTML, 
    // - time.Time (stored with millisecond precision), 
    // - float64, 
    // - appengine.GeoPoint. 
    Value interface{} 
    // Language is a two-letter ISO 693-1 code for the field's language, 
    // defaulting to "en" if nothing is specified. It may only be specified for 
    // fields of type string and search.HTML. 
    Language string 
    // Derived marks fields that were calculated as a result of a 
    // FieldExpression provided to Search. This field is ignored when saving a 
    // document. 
    Derived bool 
} 

Как вы можете видеть, если вы не укажете язык, то по умолчанию «EN»

Однако, как можно видеть в search api source code:

class Field(object): 
    """An abstract base class which represents a field of a document. 

    This class should not be directly instantiated. 
    """ 


    TEXT, HTML, ATOM, DATE, NUMBER, GEO_POINT = ('TEXT', 'HTML', 'ATOM', 'DATE', 
               'NUMBER', 'GEO_POINT') 

    _FIELD_TYPES = frozenset([TEXT, HTML, ATOM, DATE, NUMBER, GEO_POINT]) 

    def __init__(self, name, value, language=None): 
    """Initializer. 

В частности This class should not be directly instantiated.

Есть несколько других подклассов Field, которые вы должны использовать вместо этого. Для текущего примера следует использовать (при условии, что p.id является строкой. В противном случае используйте NumberField)

class TextField(Field): 
    """A Field that has text content. 

и

class AtomField(Field): 
    """A Field that has content to be treated as a single token for indexing. 
Смежные вопросы