10

値が「Benjamin」のlastNameというエンティティがあります。ユーザーが「ベン」または「ジャム」または「ベンジャ」を入れた場合にそれを客観化する方法はありますか?query.filter()を使用してこのエンティティを見つけることができます。他の検索基準iamチェックがあるので、クエリを使用する必要があります。

「Obgaektify」で「startswith」演算子と呼ばれるものを見ました。しかし、それは機能していません。任意の提案をいただければ幸いです。ありがとう

4

4 に答える 4

12

サブ文字列に対する「LIKE」タイプのクエリはありませんが、インデックスのand演算子を利用することで、大文字と小文字を区別する「startswith」をシミュレートできます。><

// The start string
String searchStr = "Ben";

// emulate a "starts with" query
Query q = new Query("MyEntity")
q.addFilter("name", Query.FilterOperator.GREATER_THAN_OR_EQUAL, searchStr);
q.addFilter("name", Query.FilterOperator.LESS_THAN, searchStr + "\ufffd");

nameクエリは、「Ben」で始まり、未満のアイテムをプロパティで「検索」します"Ben\ufffd"。ここで、\ufffdは可能な限り最高のUnicode文字です。

于 2011-08-10T18:22:20.853 に答える
2

contains-likeクエリの標準の既存のインデックスはありません。ところで、あなたはいつでもあなた自身を紹介することができます。この場合、次のことができます。

  1. のような合成フィールドを追加しますString[] lastNameIndex
  2. 利用可能なすべての組み合わせでフィールドを@PrePersist埋めるとしてマークされたメソッドを追加しますlastNameIndex
  3. このインデックスを使用してエンティティを検索する場合は、query.filter('lastNameIndex =', val)
于 2011-08-10T18:17:12.200 に答える
0

クリスからの回答とニックからのコメントをまとめると、objectifyV4のクエリフィルターを作成するためのコードは次のとおりです。

public <T> Query<T> fieldStartsWith(Query<T> query, String field, String search){
    query = query.filter(field + " >=", search);
    return query.filter(field + " <", searchStr+"\ufffd");
}
于 2013-02-23T08:43:44.670 に答える
0

トークン化方式を使用しました。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();}

これにより、インデックス可能なフィールドを定義してから、標準のOfyクエリとSearchServiceを処理できます。

于 2015-10-27T09:57:01.647 に答える