Google app engine 使用objectify在实体中搜索子字符串
我有一个名为lastName的实体,值为“Benjamin”。是否有一种客观化的方式,如果用户输入“Ben”或“jam”或“Benja”。我仍然能够使用query.filter()找到此实体。我必须使用该查询,因为还有其他iam检查的搜索条件Google app engine 使用objectify在实体中搜索子字符串,google-app-engine,objectify,Google App Engine,Objectify,我有一个名为lastName的实体,值为“Benjamin”。是否有一种客观化的方式,如果用户输入“Ben”或“jam”或“Benja”。我仍然能够使用query.filter()找到此实体。我必须使用该查询,因为还有其他iam检查的搜索条件 我在“Obgaektify”中看到了一个叫做“start with”操作符的东西。但它不起作用。如有任何建议,将不胜感激。谢谢对于包含类查询,没有标准的现有索引。顺便说一句,你可以介绍你自己的。在这种情况下,您可以执行以下操作: 添加和合成字段,如Stri
我在“Obgaektify”中看到了一个叫做“start with”操作符的东西。但它不起作用。如有任何建议,将不胜感激。谢谢对于包含类查询,没有标准的现有索引。顺便说一句,你可以介绍你自己的。在这种情况下,您可以执行以下操作:
String[]lastNameIndex
@PrePersist
的方法,该方法将用所有可用组合填充lastNameIndex
字段query.filter('lastNameIndex=',val)
子字符串没有“LIKE”类型的查询,但是可以通过利用
和将Chris的答案和Nick的注释放在一起来模拟区分大小写的“start with”,下面是为objectify V4构建查询过滤器的代码:
public <T> Query<T> fieldStartsWith(Query<T> query, String field, String search){
query = query.filter(field + " >=", search);
return query.filter(field + " <", searchStr+"\ufffd");
}
public Query fieldStartsWith(查询查询、字符串字段、字符串搜索){
query=query.filter(字段+“>=”,搜索);
return query.filter(field+“我使用了标记化方法。以下是Java代码:
private String tokenize(String phrase) {
StringBuilder tokens = new StringBuilder();
try {
for (String word : phrase.split(" ")) {
if (word.length() < 1) {
continue;
}
int j = 1;
while (true) {
for (int i = 0; i < word.length() - j + 1; i++) {
tokens.append(word.substring(i, i + j)).append(" ");
}
if (j == word.length()) {
break;
}
j++;
}
}
} catch (Throwable t) {
t.printStackTrace();
}
return tokens.toString();}
私有字符串标记化(字符串短语){
StringBuilder标记=新的StringBuilder();
试一试{
for(字符串字:短语.split(“”)){
if(word.length()<1){
继续;
}
int j=1;
while(true){
对于(int i=0;i
这允许定义一个可索引字段,然后处理Y查询和搜索服务的标准。'u'\ufffd'是这里要使用的标准“最大UTF字符”。酷,通过勾选绿色勾号来接受答案,这将为您提供2rep,代表答案所有者,并向其他人表明问题已得到解决。您为什么要这样做在名称中搜索子字符串?我从来没有见过这样的好用例。实际上它不在名称中。它通常在文本搜索中。但为了简单起见,我只说了名称:)好吧,问题仍然存在。全文搜索进行词干分析和规范化,然后搜索整个单词,因为查询“cat”return“detecate”没有什么意义。好吧,现在要求改变了,我只需要检查它是否以给定的文本开头。比如“benjamin”以“ben”而不是“jam”开头“或其他任何内容。因此,我将尝试下面发布的解决方案并查看结果。感谢您的帮助我认为应该是<“\ufffd”
,而不是。谢谢奥利弗,您是对的。我修改了我的答案!
private String tokenize(String phrase) {
StringBuilder tokens = new StringBuilder();
try {
for (String word : phrase.split(" ")) {
if (word.length() < 1) {
continue;
}
int j = 1;
while (true) {
for (int i = 0; i < word.length() - j + 1; i++) {
tokens.append(word.substring(i, i + j)).append(" ");
}
if (j == word.length()) {
break;
}
j++;
}
}
} catch (Throwable t) {
t.printStackTrace();
}
return tokens.toString();}