Google App Engine - 使用Search API Python和列表字段

Ric*_*ber 7 python google-app-engine gae-search

我正在使用ndb.Model.Search API具有以下字段类:

    TextField : plain text
    HtmlField : HTML formatted text
    AtomField : a string which is treated as a single token
    NumberField : a numeric value (either float or integer)
    DateField : a date with no time component
    GeoField : a locale based on latitude and longitude
Run Code Online (Sandbox Code Playgroud)

假设我有一个'tags'字段,它是一个列表字段:

    tags = ndb.StringProperty(repeated=True)
Run Code Online (Sandbox Code Playgroud)

我该如何对待这个领域search.Document

现在我把tags列表变成一个字符串:

    t = '|'.join(tags)
Run Code Online (Sandbox Code Playgroud)

然后:

    search.TextField(name=cls.TAGS, value=t)
Run Code Online (Sandbox Code Playgroud)

有什么建议?

mor*_*aes 6

为每个"标记"使用唯一标识符.然后你可以创建一个文件,如:

doc = search.Document(fields=[
    search.TextField(name='tags', value='tag1 tag2 tag3'),
])
search.Index(name='tags').put(doc)
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用数字(ids)作为字符串:

doc = search.Document(fields=[
    search.TextField(name='tags', value='123 456 789'),
])
Run Code Online (Sandbox Code Playgroud)

并根据需要使用运算符进行查询:

index = search.Index(name='tags')
results = index.search('tags:(("tag1" AND "tag2") OR ("tag3" AND "tag4"))')
Run Code Online (Sandbox Code Playgroud)


小智 6

您应该添加与"tag"一样多的字段,所有字段都使用相同的field_name:

doc = search.Document(fields=[
    search.TextField(name='tag', value=t) for t in tags
])
Run Code Online (Sandbox Code Playgroud)

如在文档中:

字段只能包含一个值,该值必须与字段的类型匹配.字段名称不必是唯一的.文档可以具有多个具有相同名称和相同类型的字段,这是表示具有多个值的字段的方式.(但是,不能重复具有相同名称的日期和数字字段.)文档还可以包含具有相同名称和不同字段类型的多个字段.

  • 这确实是推荐的方法.注意:管理控制台当前不会显示多个具有相同名称的字段...因此,似乎只添加了"最后一个字段"...实际上它们都在那里 (2认同)