google app engine - pricing - Buscar subcadena dentro de una entidad usando objectify
google app engine tutorial español (4)
He usado el método de tokenización. Aquí está el código en 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();}
Esto permite definir un campo indexable, luego procesar consultas estándar de Ofy y SearchService.
Tengo una entidad llamada lastName con el valor "Benjamin". ¿Hay alguna manera en objectify que si el usuario pone "Ben" o "jam" o "Benja". Todavía puedo encontrar esta entidad usando query.filter (). Debo usar la consulta ya que hay otros criterios de búsqueda iam checking.
Vi algo en "Obgaektify" llamado operador "starts with". Pero no está funcionando. Cualquier sugerencia sera apreciada. Gracias
No existe un índice estándar existente para consultas con contenido similar. Por cierto, siempre puedes presentar el tuyo. En este caso puedes hacer:
- agregar y campo sintético como
String[] lastNameIndex
- agregue el método marcado como
@PrePersist
que completará el campolastNameIndex
con todas las combinaciones disponibles - Cuando desee encontrar entidades que usen este índice,
query.filter(''lastNameIndex ='', val)
Poniendo la respuesta de Chris y el comentario de Nick juntos, aquí está el código para construir un filtro de consulta para 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");
}
No hay consultas de tipo "ME GUSTA" para la subcadena, sin embargo, se puede simular un "inicio con" sensible a mayúsculas y minúsculas aprovechando los operadores >
y <
en los índices.
// 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");
La consulta ''buscará'' la propiedad del name
para los elementos que comienzan con "Ben", y son inferiores a "Ben/ufffd"
, donde /ufffd
es el máximo carácter Unicode posible.