値が「Benjamin」のlastNameというエンティティがあります。ユーザーが「ベン」または「ジャム」または「ベンジャ」を入れた場合にそれを客観化する方法はありますか?query.filter()を使用してこのエンティティを見つけることができます。他の検索基準iamチェックがあるので、クエリを使用する必要があります。
「Obgaektify」で「startswith」演算子と呼ばれるものを見ました。しかし、それは機能していません。任意の提案をいただければ幸いです。ありがとう
値が「Benjamin」のlastNameというエンティティがあります。ユーザーが「ベン」または「ジャム」または「ベンジャ」を入れた場合にそれを客観化する方法はありますか?query.filter()を使用してこのエンティティを見つけることができます。他の検索基準iamチェックがあるので、クエリを使用する必要があります。
「Obgaektify」で「startswith」演算子と呼ばれるものを見ました。しかし、それは機能していません。任意の提案をいただければ幸いです。ありがとう
サブ文字列に対する「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文字です。
contains-likeクエリの標準の既存のインデックスはありません。ところで、あなたはいつでもあなた自身を紹介することができます。この場合、次のことができます。
String[] lastNameIndex@PrePersist埋めるとしてマークされたメソッドを追加しますlastNameIndexquery.filter('lastNameIndex =', val)クリスからの回答とニックからのコメントをまとめると、objectifyV4のクエリフィルターを作成するためのコードは次のとおりです。
public <T> Query<T> fieldStartsWith(Query<T> query, String field, String search){
query = query.filter(field + " >=", search);
return query.filter(field + " <", searchStr+"\ufffd");
}
トークン化方式を使用しました。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を処理できます。