我正在编写查询,但它总是说“找不到匹配的索引”。我不知道为什么。我的代码如下:
Query query = pm.newQuery(Classified.class);
query.setFilter("emp_Id == emp");
query.setOrdering("upload_date desc");
query.declareParameters("String emp");
List<Classified> results = (List<Classified>)query.execute(session.getAttribute("emp_Id").toString());
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
<datastore-index kind="Classified" ancestor="false">
<property name="emp_Id" direction="asc" />
<property name="category" direction="asc" />
<property name="upload_date" direction="desc" />
</datastore-index>
</datastore-indexes>
我已添加上述索引,但没有帮助。
答案 0 :(得分:6)
我认为您需要配置Datastore Index。可能已经在WEB-INF/appengine-generated/datastore-indexes-auto.xml
的Eclipse中为您生成了一个,您只需将其复制到WEB-INF/datastore-indexes.xml
并再次部署。
答案 1 :(得分:2)
因为这需要在互联网上的某个地方......
当我发现这一点时,我踢了自己 错误是您没有与查询要执行的索引匹配的索引。您可以为每个实体提供多个索引。在Logcat错误中,它会告诉您确切要设置的索引以及元素需要的顺序。
即,如果错误说它想要(它不会很好地格式化):
<datastore-index kind="Classified" ancestor="false">
<property name="category" direction="desc" />
<property name="upload_date" direction="desc" />
</datastore-index>
然后项目 - &gt;战争 - &gt; WEB-INF - &gt; appengine-generated - &gt; datastore-indexes-auto.xml并准确添加。然后,重新部署项目。
接下来进入您的Google云端控制台,查看数据存储区 - &gt;索引。应该说索引正在准备中(如果您可以终止所有连接的应用程序并关闭控制台中的实例,这会更快。)
一旦进入其他索引列表,请重新运行您的应用程序,它不会再出现关于索引的错误。
Go get it Gentlemen / Ladies
答案 2 :(得分:1)
您定义的索引必须按照返回的顺序保存所有可能的结果。您的查询要求输入由upload_date排序的特定emp_Id,但您的索引主要按类别排序。
尝试从索引定义中删除类别行,或交换的顺序,使category
和upload_date
,upload_date
成为主要排序顺序指数。如果代码的另一部分依赖于类别行,则可能必须创建两个单独的索引(这会产生一些计算成本)。
编辑:请参阅Nick Johnson的评论。额外的参数。
答案 3 :(得分:0)
在执行单个属性查询时,我正在遇到此问题:
const query = datastore
.createQuery('Emailing_dev')
.filter('status', '=', 'Scheduled')
就我而言,应该不会出现任何错误,但是会出现错误9:找不到匹配的索引。
如果我在yaml中两次定义了单个属性索引,它将起作用:
indexes:
- kind: Emailing_dev
properties:
- name: status
- name: status
但这肯定是一个错误.. !!