【发布时间】:2014-09-16 15:15:09
【问题描述】:
我有一个包含以下字段的索引实体:
@Index private String entry;
@Index private Date created;
// ...
查询索引时,将搜索词的首字母(此处为:find)与条目进行比较:
Key<Result> fromKey = Key.create(Result.class, find);
Key<Result> toKey = Key.create(Result.class, find + "\uFFFD");
query = query.filterKey(">=", fromKey).filterKey("<", toKey);
[请注意,在这种情况下,条目被附加并用作键,但在这方面它不应该改变任何东西。]
这将返回条目以搜索词开头的所有实体。到目前为止,很好。
现在我想要按“创建”日期排序的结果,但应用商店不允许我这样做:
query = query.order("-created");
它返回“java.lang.IllegalArgumentException:第一个排序属性必须与应用不等式过滤器的属性相同。”
我无法在代码中进行排序,因为我需要进行分页,我总是根据“创建”日期查询下一页结果:客户端查询第一页,然后发送带有日期的相同查询接收第二页的最后一个结果,等等。
从本质上讲,我认为问题在于我们这里涉及到两个不等式过滤器,而数据存储区不支持。
有没有办法有效地解决这个问题?如何编写索引?您是否改用全文搜索?或者有没有办法在数据存储/对象化中解决这个问题,比如使用多个字段的复合索引来规避这个问题?
--
我想出的唯一奇怪的解决方案是在索引记录中创建多个字段或多次添加记录。示例:
entry = "hotel" -> 添加为 "h"、"ho"、"hot"、"hote" 和 "hotel"
效率不是很高,但这会使不等式搜索成为等式搜索。
【问题讨论】:
标签: java google-app-engine google-cloud-datastore objectify