2013-05-06 51 views
7

我正在使用ndb.Model。 搜索API具有以下字段类别:Google App Engine - 使用搜索API Python与列表字段

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) 

有什么建议?

+0

有几个问题。 1.为什么使用文本搜索标签,这适合数据存储查询。 2,为什么要连接'|'为什么不是空格字符 – 2013-05-07 00:12:52

+0

嘿蒂姆。 1.我希望用户能够在表单搜索字段中输入一个单词并使用它来搜索不同的字段。假设他输入'Carpenter',结果将包括'Carpenter'作为标签(例如工作)和'Carpenter'作为姓。 2.我正在使用管道连接,因为可能会有两个文字标签,如“专业阅读器”。 – 2013-05-07 00:27:57

+0

如果要执行标记的联合或交点,数据存储不适用。 – moraes 2013-05-09 05:32:31

回答

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"))') 
+0

谢谢,莫拉斯,我会试试看。 – 2013-05-12 02:39:54

5

你应该添加尽可能多的字段作为'标签'你有,所有使用相同的字段名称:

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

正如在文档中:

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

+2

这确实是推荐的方法。注意:管理控制台当前没有显示多个字段具有相同的名称......所以它会显示只有“最后一个字段”被添加了......实际上他们都在那里 – 2014-05-03 19:56:09

相关问题