7

我正在使用 ndb.Model。搜索 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

假设我有一个“标签”字段,它是一个列表字段:

    tags = ndb.StringProperty(repeated=True)

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

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

    t = '|'.join(tags)

接着:

    search.TextField(name=cls.TAGS, value=t)

有什么建议么?

4

2 回答 2

7

您应该添加与“标签”一样多的字段,所有字段都具有相同的 field_name:

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

如文档中所示:

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

于 2013-11-29T14:01:10.127 回答
6

为每个“标签”使用唯一标识符。然后您可以创建一个文档,例如:

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

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

doc = search.Document(fields=[
    search.TextField(name='tags', value='123 456 789'),
])

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

index = search.Index(name='tags')
results = index.search('tags:(("tag1" AND "tag2") OR ("tag3" AND "tag4"))')
于 2013-05-09T05:30:10.553 回答