英文:
Appengine search language
问题
我正在尝试实现search.FieldLoadSaver接口,以便能够选择字段语言。
func (p *Product) Save() ([]search.Field, error) {
var fields []search.Field
// 添加 product.ID
fields = append(fields, search.Field{Name: "ID", Value: search.Atom(p.ID)})
// 添加 product.Name
fields = append(fields, search.Field{Name: "Name", Value: p.Name, Language: "en"})
return fields, nil
}
我得到了这个错误:errors.errorString{s:"search: INVALID_REQUEST: invalid language . Languages should be two letters."}
看起来Python devserver将空的语言字段视为错误。
编辑:所以问题是我放置了多个具有相同名称并且将语言设置为空的字段。看起来这是不允许的,所以当你使用多个具有相同名称的字段时,请确保也设置语言。
英文:
I'm trying to implement search.FieldLoadSaver interface to be able to pick field language.
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
}
And i'm getting this error : errors.errorString{s:"search: INVALID_REQUEST: invalid language . Languages should be two letters."}
It seems that python devserver handles empty language field as an error.
EDIT: so the problem was that i was putting multiple fields with the same name and setting language to be empty. It appears that this isn't allowed, so when you're using multiple fields with same name, make sure you're putting language also.
答案1
得分: 1
我不确定你的问题是什么,但是你可以在这里看到你认为的(似乎Python 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"。
然而,正如在搜索 API 源代码中所示:
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.
英文:
I'm not sure what exactly your question is but here you can see that what you think (It seems that python devserver handles empty language field as an error.) is not true.
Code snippet from that documentation
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
}
As you can see, if you specify no language, it defaults to "en"
However, as can be seen in the 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.
In particular This class should not be directly instantiated.
There are some other Field subclasses that you should be using instead. For your current example you should use (assuming that p.id is a string. Otherwise use NumberField)
class TextField(Field):
"""A Field that has text content.
and
class AtomField(Field):
"""A Field that has content to be treated as a single token for indexing.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论