首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在GAE上实现新闻提要--我应该使用预期搜索吗?

在GAE上实现新闻提要--我应该使用预期搜索吗?
EN

Stack Overflow用户
提问于 2013-12-12 17:39:07
回答 2查看 377关注 0票数 8

我现在有个问题我一直在纠结。我试图使用GAE、云端点和java在我的应用程序中实现一个新闻提要功能。共同的概念是追随者和叶利维,其中一个行动可以看到他的追随者。一个新的追随者也应该看到他的过去的行动,而不仅仅是从他开始跟踪的时间。

我用以下组件做了几次尝试。每一次尝试都很成功,但却缺少一些东西:

  1. 在每个用户操作中,我都在数据存储中添加了一个“log”实体,其中包含了用户id。当一个用户显示他的新闻提要时,我只是根据用户的文件夹列表,通过他们的用户i查询所有这些实体。一切都很好,直到我意识到'IN‘查询不能被删减。所以这个选择就没了。
  2. 在这个尝试中,它也是应用程序的当前状态,im使用搜索API。对于每个用户操作,我不再将“日志”实体存储到数据存储中,而是将文档存储到搜索索引中。复杂的查询可以在这里被删减,世界再次微笑。但是..。我不太确定,明智之举,这是一个聪明的割礼。似乎搜索/添加/删除文档的成本--记录在案的日常限制--使整个工作变得过于粗略。
  3. 下一次尝试应该是预期的搜索API。根据我在文档中所读到的内容,它似乎是为此目的选择的正确组件。不幸的是,文档确实很差,并且给出了很少的例子。另外,账单信息也不清楚。

所以我请求堆叠溢出社区的建议。关于这件事,你能告诉我吗?如果前瞻性搜索是正确的选择,那么您能提供一些使用云端点的清晰示例java代码吗?

编辑:只是为了强调这里的主要设计需求--新闻提要功能需要能够使用游标获取排序的折叠操作(以避免查询整个批)。

EN

回答 2

Stack Overflow用户

发布于 2013-12-16 08:38:54

使用每个跟随者的拉集模型:定期(或按需)查询所有的折叠动作一次,然后将它们缓存在一个专用的每个跟随者实体中。记住上次查询的时间,所以下一次您只需要从那个点开始查询(假设操作不能添加/更改到过去的时间)。

这将为您提供以下特性(和限制):

  1. 如果查询是按需查询,则不需要查询不活动的用户.
  2. 由于查询是“新建的”(只查找新的操作),如果返回零结果,它将不会花费任何费用。
  3. 您将只查询每个跟随者的每个后续操作一次。之后,所有最近的操作都将缓存在一个实体中,并用一个get加载到内存中。这应该是一个很大的成本和节省时间。
  4. 您可以根据需要对内存中的操作进行排序/筛选。

限制:

  1. 实体有1MB的限制,所以您可以在一个实体中缓存最大的no操作。因此,您需要限制每个用户最近操作的缓存,或者将动作缓存分散到多个实体上。
  2. 您将需要使用(最多30),还需要使用并行线程来实现良好的性能。当查询1000到2000页时,这很容易达到3-5秒.此外,当同时为多个用户服务时,您可以轻松地达到每个实例的RPC限制(也就是最大并发API调用)。
票数 2
EN

Stack Overflow用户

发布于 2013-12-15 03:35:19

我希望我正确地理解了这个问题--你想要在你的应用程序中实现一个新闻输入,并允许用户相互跟踪。新的追随者需要能够看到用户的行动。我确信解决这个问题的方法有很多种,但是我将尝试通过提供一个使用JAVA访问数据存储的解决方案来帮助您解决这个问题。

我将首先按照以下方式设计JDO中的实体关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 User to many actions.
1 User to many followers (User).
1 User to many following (User). 

下面是简单的JDO类:

用户类别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class User {

    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private String userId; // Google unique user ID, could also store user email. 

    @Persistent
    private Set<Key> actions;

    @Persistent
    private Set<Key> followers;

    @Persistent
    private List<Key> following;

    public User(Key key, String userId) {
        this.key       = key;
        this.userId    = userId;
        this.actions   = new HashSet<Key>();
        this.followers = new HashSet<Key>();
        this.following = new HashSet<Key>();  
    }

    public Key getKey() {
        return this.key;
    }

    public void addAction(Key actionKey) {
        this.actions.add(actionKey);
    }

    public void addActions(Set<Key> actionKeys) {
        this.actions.addAll(actionKeys);
    }

    public Set<Key> getActions() {
        return this.actions;
    }

    public void addFollower(Key followerKey) {
        this.followers.add(followerKey);
    }

    public void addFollowers(Set<Key> followerKeys) {
        this.followers.addAll(followerKeys);
    }

    public Set<Key> getFollowers() {
        return this.followers;
    }

    public void addFollowing(Key followingKey) {
        this.following.add(followingKey);
    }

    public void addAllFollowing(Set<Key> followingKeys) {
        this.following.addAll(followingKeys);
    }

    public Set<Key> getFollowing() {
        return this.following;
    }

}

行动类别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class Action {

    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    Date date;

    @Persistent
    private String title;    

    public Action(Key key, String title) {

        this.key   = key;
        this.title = title;

        this.date  = new Date(); // date of creation (now). 

    }

    public Key getKey() {
        return this.key;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return this.title;
    }

}

Action使用Date属性,您可以参考文档获取数据存储中适用的数据类型。创建动作时,对Date对象进行分配和初始化,使其表示分配的时间,测量到最近的毫秒。

在上面的示例中,我通过它们的键链接了实体,您可以通过它们的类链接它们,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Action> actions;

在我的例子中,这种关系是一种没有人拥有的一对多的关系,也许它应该是一对多的。更多的信息,这里,让您看一看,也许可以决定哪一个最适合您的解决方案。

一旦定义了关系,您就可以围绕JDO模型类创建端点类了。这将创建基本的api方法。您可能希望更改端点类方法以满足您的需要,例如,更改创建操作的方式。一个基本的示例是从操作标题创建密钥,如下所示(ActionEnpoint.java):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
@ApiMethod(name = "insertAction")
public Action insertAction( @Named("title") String title ) {

    PersistenceManager pm = getPersistenceManager();

    Key key = KeyFactory.createKey(Action.class.getSimpleName(), title);

    Action action = null;

    try {
        action = new Action(key, title);
        pm.makePersistent(action);
    } finally {
        pm.close();
    }

    return action;

}
...

如果愿意,可以向UserEndpoint类添加一个方法,以查询数据存储,并使用datastore查询对象返回属于该用户的所有操作和每个日期。

您需要向UserEndpoint类添加一个方法,该方法允许您向该用户添加一个操作,下面是一个简单的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
@ApiMethod(name = "addActionToUser")
public Achiever addActionToUser(
    @Named("userId") String userId, 
    @Named("actionTitle") String actionTitle) {

    PersistenceManager pm = getPersistenceManager();

    Key userKey   = KeyFactory.createKey(User.class.getSimpleName(), userId);
    Key actionKey = KeyFactory.createKey(Action.class.getSimpleName(), actionTitle);

    User user = null;

    try {   
        user = (User) pm.getObjectById(User.class, userKey);
        user.addAction(actionKey);
        pm.makePersistent(user);
    } catch (Exception e) {

    } 

    return user;
}
...

一旦完成上述所有操作,您就可以通过调用getUser类中的UserEndpoint方法轻松地获得每个用户的操作列表,该方法返回一个user对象。然后可以调用ReturnedUserObject.getActions()。一个新的追随者现在可以通过调用api方法来获取"followees“对象并获得他/她的操作来查看所有的"followees”操作。然后,您可以按日期对操作进行排序,也可以根据您的设想进行排序。

我希望我正确地理解了你的问题,我不确定你提到的第一个部分,但似乎你把你的关系搞混了。我希望这个解决方案至少指向正确的方向:)。

如果你需要任何额外的帮助或澄清,或者我的回答完全偏离了你想要的,那么请告诉我。

你好,Miki

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20557651

复制
相关文章
Hive 视图和索引
Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时,Hive 可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。
每天进步一点点
2022/12/15
1.4K0
Hive 视图和索引
SQL Server 索引和视图
索引(Index)是数据库中一种用于加速对表中数据的检索速度的数据结构。索引类似于书籍的目录,它提供了一种快速查找数据行的方法,避免了全表扫描的开销。通过使用索引,数据库系统可以直接定位到符合特定搜索条件的数据,而不必逐行遍历整个表。
神秘泣男子
2024/06/03
1140
SQL Server 索引和视图
事务、视图、索引、备份和恢复
创建视图:CREATE VIEW view_name AS <SELECT 语句>;
小陈运维
2021/10/13
3570
数据库:视图和索引
视图是一张虚拟表,并不在数据库中以存储数据值集的形式存在。在引用过程中依据基表动态生成。
全栈程序员站长
2022/09/16
6310
视图索引
大家好,又见面了,我是你们的朋友全栈君。创建索引视图 视图也称为虚拟表,这是因为由视图返回的结果集其一般格式与由列和行组成的表相似,并且,在 SQL 语句中引用视图的方式也与引用表的方式相同。标准视图的结果集不是永久地存储在数据库中。查询每次引用视图时,Microsoft&reg; SQL Server&#8482; 2000 会动态地将生成视图结果集所需的逻辑合并到从基表数据生成完整查询结果集所需的逻辑中。生成视图结果的过程称为视图具体化。有关更多信息,请参见视图解析。 对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图更为可观。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。有关用于存储聚集索引的结构的更多信息,请参见聚集索引。 说明 只有安装了 Microsoft SQL Server 2000 企业版或 Microsoft SQL Server 2000 开发版,才可以创建索引视图。 在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命名视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。有关更多信息,请参见在视图上使用索引。 在视图上创建聚集索引可存储创建索引时存在的数据。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。 与基表上的索引相比,对索引视图的维护可能更复杂。只有当视图的结果检索速度的效益超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射到相对静态的数据上、处理多行以及由许多查询引用的视图。 视图的要求 在视图上创建聚集索引之前,该视图必须满足下列要求: 当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。OBJECTPROPERTY 函数通过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。 为执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。 视图不能引用任何其它视图,只能引用基表。 视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。 必须使用 SCHEMABINDING 选项创建视图。SCHEMABINDING 将视图绑定到基础基表的架构。 必须已使用 SCHEMABINDING 选项创建了视图中引用的用户定义的函数。 表和用户定义的函数必须由 2 部分的名称引用。不允许使用 1 部分、3 部分和 4 部分的名称。 视图中的表达式所引用的所有函数必须是确定性的。OBJECTPROPERTY 函数的 IsDeterministic 属性报告用户定义的函数是否是确定性的。有关更多信息,请参见确定性函数和非确定性函数。 视图中的 SELECT 语句不能包含下列 Transact-SQL 语法元素: 选择列表不能使用 * 或 table_name.* 语法指定列。必须显式给出列名。 不能在多个视图列中指定用作简单表达式的表的列名。如果对列的所有(或只有一个例外)引用是复杂表达式的一部分或是函数的一个参数,则可多次引用该列。例如,下列选择列表是非法的: SELECT ColumnA, ColumnB, ColumnA 下列选择列表是合法的: SELECT ColumnA, AVG(ColumnA), ColumnA + Column B AS AddColAColB SELECT SUM(ColumnA), ColumnA % ColumnB AS ModuloColAColB 派生表。 行集函数。 UNION 运算符
全栈程序员站长
2022/09/16
1.2K0
数据库视图和索引
虚拟视图是由其他其他关系上的查询所定义的一种关系。虚拟视图并不在数据库中存储,但可对其进行查询,就好像它被存储在数据库中一样。查询处理器会在执行查询时用视图的定义来替换视图。 试图也可以被物化,即它们从数据库中定期的进行构造并存储。物化可以加快查询的执行,一种典型的“物化视图”就是索引。 虚拟视图 视图定义 CREATE VIEW <视图名> AS <视图定义>; 例如:有个关系如下: Movies(title, year, length, name, producer) 要在其上创建一个视图,包括2018
SuperHeroes
2018/05/31
1.3K0
视图和索引(数据库学习)
引入—数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合所有用户的需求。
营琪
2019/11/04
1.1K0
mysql创建索引视图_mysql中创建视图、索引[通俗易懂]
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
全栈程序员站长
2022/09/16
7.7K0
索引与视图
一个多列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。 当查询语句的条件中包含last_name 和 first_name时
全栈程序员站长
2022/09/16
3260
视图索引问题
  最近和一直在研究如何加快查询数据库的速度,看了网络上说用索引,会加快查询的速度.我就认真看了索引了一些文章,也建立了表索引.但是在建立视图索引的时候遇到问题了, 无法在视图 ‘SBK_VIEW’ 上创建 索引,因为该视图未绑定到架购.查一下相关的资料,发现:
全栈程序员站长
2022/09/16
4220
Oracle 视图索引
注:为了在当前用户模式中创建视图,要求数据库用户必须有create any view(创建任何视图)的权限。
全栈程序员站长
2022/09/16
1.3K0
Oracle 视图索引
solr合并索引
solr下可以通过mergeindexes命令完成一个或多个core到其他core的索引合并,合并索引需要保证要被合并到的core的schema要与其他来源core的schema兼容,否则就会出现无法启动core的问题,我们可以通过代码CoreAdminRequest.MergeIndexes类实现,实例代码如下:
johnhuster的分享
2022/03/28
5270
【iOS 开发】父视图外部子视图点击响应 - hitTest
面试被问过两次了的一个问题,记录一下:假如一个 UIView(我们称作 FatherView),有一个 subview(我们称作 ChildView),这个 ChildView 在 FatherView 的 frame 外部,那么默认情况下,这个 ChildView 被点击的时候,并不会触发 FatherView 的点击响应链(这是合情合理的,FatherView 所在的位置都没被点击,它不遍历 subviews,不作回应是正常的),这时候怎样才能让这个 ChildView 相应点击事件?
KyXu
2019/04/11
1.1K0
【iOS 开发】父视图外部子视图点击响应 - hitTest
【MySQL】表的内外连接和视图
内连接实际上就是利用 where 子句对两种表形成的笛卡尔积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
YoungMLet
2024/03/01
1840
【MySQL】表的内外连接和视图
MySQL中的索引、视图和DBA操作
索引就相当于一本书的目录,通过目录可以快速地找到对应的资源。在数据库方面,查询一张表的时候有两种检索方式:
共饮一杯无
2022/11/28
1.1K0
hive之路9-hive索引和视图
本文中主要是介绍了hive中索引和视图的相关操作。 修改表 修改表主要是对表的结构和属性进行操作,包含: 重命名 alter table oldname rename to new_table; 修改表属性 alter table table_name set tblproperties (property_name=property_value); 修改表注释 alter table table_name set tblproperties('comment'=new_comment); 修改存储属
皮大大
2021/03/02
7340
SQLServer中使用索引视图(物化视图)
物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一样,可以创建 索引,主键约束等等,性能会有质的提升,但是其有缺点,会占用,可以设置它定时自动更新一次,也可以手动更新,当然也是可以设置及时更新的,但是会拉慢基表的增删改查操作,在这里我只讲思路,具体的话大家可以自己去研究。
跟着阿笨一起玩NET
2018/09/19
3.3K0
mysql之视图、索引
视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。
全栈程序员站长
2022/09/16
9860
sqlserver 视图创建索引_Oracle创建索引
1、添加索引 create index 索引对象名 on 索引对应表名(表内索引对象字段名); 例:需创建包含userid属性的userinfo表。 create index userid on system.userinfo(userid);
全栈程序员站长
2022/10/04
1.3K0
sqlserver 视图创建索引_数据库视图可以建立索引吗
视图(View)是从一个或多个表或其它视图导出的,用来导出视图的表称为基表,导出的视图又称为虚表。在数据库中,只存储视图的定义,不存放视图对应的数据,这些数据仍然存放在原来的基表中。 使用视图前,必须先创建视图,创建视图要遵守以下原则: (1)只有在当前数据库中才能创建视图,视图命名必须遵循标识符规则。 (2)不能将规则、默认值或触发器与视图相关联。 (3)不能在视图上建立任何索引。
全栈程序员站长
2022/09/23
2.8K0
sqlserver 视图创建索引_数据库视图可以建立索引吗

相似问题

使用完全外部联接对视图进行索引优化

10

完全外部连接减慢查询

20

无法运行完全外部连接

10

oracle数据库过滤器与完全外部连接和合并相交

10

外部连接抑制索引使用?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文