Google app engine 使用objectify在实体中搜索子字符串

Google app engine 使用objectify在实体中搜索子字符串,google-app-engine,objectify,Google App Engine,Objectify,我有一个名为lastName的实体,值为“Benjamin”。是否有一种客观化的方式,如果用户输入“Ben”或“jam”或“Benja”。我仍然能够使用query.filter()找到此实体。我必须使用该查询,因为还有其他iam检查的搜索条件 我在“Obgaektify”中看到了一个叫做“start with”操作符的东西。但它不起作用。如有任何建议,将不胜感激。谢谢对于包含类查询,没有标准的现有索引。顺便说一句,你可以介绍你自己的。在这种情况下,您可以执行以下操作: 添加和合成字段,如Stri

我有一个名为lastName的实体,值为“Benjamin”。是否有一种客观化的方式,如果用户输入“Ben”或“jam”或“Benja”。我仍然能够使用query.filter()找到此实体。我必须使用该查询,因为还有其他iam检查的搜索条件


我在“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();}