我们在数据存储区中将标签的种类列为实物,并且具有标签词的列表,我们要过滤数据存储区匹配项或大小写,并根据匹配关键字的数量对其进行排序
我们如何在App Engine查询平台Java中做到这一点,如果您有任何想法,请帮助我们。
请找到型号
考虑模型
public class Car {
String id;
String name;
String model;
String manufacture;
int year;
List<String> tags;
}
数据库结构也是如此
List<String> searchKeyword = Arrays.asList(q.split(","));
Query query = new Query("Car");
query.setFilter(new FilterPredicate("tags",FilterOperation.IN,searchKeyword);
List<Entity> entities = ds.prepare(query).asList(withLimit(10));
例如,在这种情况下,q = royal,coupe
结果应该与显示在顶部的两个关键字都匹配,并在后面紧跟一个关键字。
Caterham 7-一个关键字Nissan 370Z-匹配两个关键字
输出日产370z Caterham 7
新闻的相同内容属于汽车模型,也具有标签,搜索也应以相同的方式在该处工作
新闻将包含标题,描述,标签,图像,视频
谢谢克里希南
无法在数据存储中本地执行此操作。IN在数据存储区中的工作方式是,它会针对列表中的每个项目发出一个查询,然后提供结果的并集(实际上,它使用的是析取范式(App Engine源代码))。
相反,您可以自己发出查询以保证所需的顺序(首先使用AND过滤器查询与N个标记匹配的结果,然后依次查询N-1,N-2,...)。
对于两个标签,它看起来像:
List<String> searchKeyword = Arrays.asList(q.split(","));
Query query = new Query("Car");
query.setFilter(CompositeFilter.and(Arrays.asList(
new FilterPredicate("tags", FilterOperation.EQUAL, searchKeyword.get(0)),
new FilterPredicate("tags", FilterOperation.EQUAL, searchKeyword.get(1)))));
List<Entity> entities = ds.prepare(query).asList(withLimit(10));
query.setFilter(CompositeFilter.or(Arrays.asList(
new FilterPredicate("tags", FilterOperation.EQUAL, searchKeyword.get(0)),
new FilterPredicate("tags", FilterOperation.EQUAL, searchKeyword.get(1)))));
entities.addAll(ds.prepare(query).asList(withLimit(10));
显然,这仅适用于两个标签,但可以推广到更多方面。您可能还应该使用异步API,以便可以并行发出所有查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句