【问题标题】:Google App Engine - Using Search API Python with list fieldsGoogle App Engine - 使用带有列表字段的 Search API Python
【发布时间】:2013-05-06 23:42:22
【问题描述】:

我正在使用 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

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

    tags = ndb.StringProperty(repeated=True)

我应该如何使用search.Document 处理这个字段?

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

    t = '|'.join(tags)

然后:

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

有什么建议吗?

【问题讨论】:

  • 几个问题。 1. 为什么使用文本搜索标签,这适合数据存储查询。 2、为什么要用'|'连接为什么不空格字符
  • 嘿蒂姆。 1. 我希望用户能够在表单搜索字段中输入一个词,并用它来搜索不同的字段。假设他输入“Carpenter”,结果将包括“Carpenter”作为标签(例如工作)和“Carpenter”作为姓氏。 2. 我正在使用管道连接,因为可能有两个单词标签,例如“专业阅读器”。
  • 如果您想执行标签的并集或交集,Datastore 不适合。

标签: python google-app-engine gae-search


【解决方案1】:

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

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

如文档中所述:

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

【讨论】:

  • 这确实是推荐的方法。注意:管理控制台目前不显示多个具有相同名称的字段......所以看起来只添加了“最后一个字段”......实际上它们都在那里
【解决方案2】:

为每个“标签”使用唯一标识符。然后你可以创建一个像这样的文档:

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

【讨论】:

  • 谢谢,moraes,我要试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多