Google App Engine: é possível fazer uma consulta GQL LIKE?

Simples um realmente. No SQL, se eu quiser pesquisar um campo de texto para alguns caracteres, posso fazer:

SELECT blah FROM blah WHERE blah LIKE '%text%' 

A documentação do App Engine não faz menção de como conseguir isso, mas certamente é um problema bastante comum?

O BigTable, que é o back-end do database do Google App Engine, será dimensionado para milhões de registros. Devido a isso, o Google App Engine não permitirá que você faça qualquer consulta que resulte em uma varredura de tabela, pois o desempenho seria terrível para uma tabela bem preenchida.

Em outras palavras, toda consulta deve usar um índice. É por isso que você só pode fazer = , > e < consultas. (Na verdade, você também pode fazer != Mas a API faz isso usando uma combinação de > e < consultas.) É também por isso que o ambiente de desenvolvimento monitora todas as consultas feitas e adiciona automaticamente todos os índices ausentes ao seu arquivo index.yaml .

Não há como indexar uma consulta LIKE por isso simplesmente não está disponível.

Acompanhe esta session do Google IO para obter uma explicação muito melhor e mais detalhada sobre isso.

Estou enfrentando o mesmo problema, mas encontrei algo nas páginas do Google Apps Engine:

Dica: os filtros de consulta não têm uma maneira explícita de corresponder apenas parte de um valor de string, mas você pode falsificar uma correspondência de prefixo usando filtros de desigualdade:

 db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2", "abc", u"abc" + u"\ufffd") 

Isso corresponde a cada entidade MyModel com uma propriedade de sequência prop que começa com os caracteres abc. A cadeia unicode u "\ ufffd" representa o maior caractere Unicode possível. Quando os valores da propriedade são classificados em um índice, os valores que caem nesse intervalo são todos os valores que começam com o prefixo especificado.

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html

talvez isso possa fazer o truque;)

Embora o App Engine não suporte as consultas LIKE, observe as propriedades ListProperty e StringListProperty . Quando um teste de igualdade é feito nessas propriedades, o teste será realmente aplicado em todos os membros da lista, por exemplo, list_property = value tests se o valor aparecer em qualquer lugar na lista.

Às vezes, esse recurso pode ser usado como uma solução alternativa para a falta de consultas LIKE. Por exemplo, torna possível fazer pesquisa de texto simples, conforme descrito neste post .

Você precisa usar o serviço de pesquisa para executar consultas de pesquisa de texto completo semelhantes ao SQL LIKE .

O Gaelyk fornece linguagem específica de domínio para realizar consultas de pesquisa mais fáceis de usar . Por exemplo, após o trecho encontrará os primeiros dez livros classificados dos mais recentes, com título contendo fern e o thriller exatamente correspondente ao gênero:

 def documents = search.search { select all from books sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE where title =~ 'fern' and genre = 'thriller' limit 10 } 

Like está escrito como operador de correspondência do Groovy =~ . Suporta funções como a distance(geopoint(lat, lon), location) também.

O App Engine lançou um serviço de pesquisa de texto completo de uso geral na versão 1.7.0 que suporta o armazenamento de dados.

Detalhes no anúncio .

Mais informações sobre como usar isso: https://cloud.google.com/appengine/training/fts_intro/lesson2

Dê uma olhada no Objectify aqui , é como uma API de access do Datastore. Há um FAQ com esta questão especificamente, aqui está a resposta

Como faço uma consulta semelhante (LIKE “foo%”)
Você pode fazer algo como um startWith ou endWith se você inverter o pedido quando armazenado e pesquisado. Você faz uma consulta de intervalo com o valor inicial desejado e um valor acima do desejado.

 String start = "foo"; ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field < ", start + "\uFFFD"); 

Basta seguir aqui: init.py # 354 “> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354

Funciona!

 class Article(search.SearchableModel): text = db.TextProperty() ... article = Article(text=...) article.save() To search the full text index, use the SearchableModel.all() method to get an instance of SearchableModel.Query, which subclasss db.Query. Use its search() method to provide a search query, in addition to any other filters or sort orders, eg: query = article.all().search('a search query').filter(...).order(...) 

Testei isso com a API Java de baixo nível do Datastore do GAE. Eu e funciona perfeitamente

  Query q = new Query(Directorio.class.getSimpleName()); Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query); Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD"); Filter filterNombre = CompositeFilterOperator.and(filterNombreGreater, filterNombreLess); q.setFilter(filter); 

Em geral, mesmo que este seja um post antigo, uma maneira de produzir um LIKE ou ILIKE é coletar todos os resultados de uma consulta ‘> =’, em seguida, o loop resulta em python (ou Java) para elementos que contêm o que você está procurando.

Digamos que você queira filtrar usuários com aq = ‘luigi’

 users = [] qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower())) for _qry in qry: if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower(): users.append(_qry) 

Não é possível fazer uma pesquisa LIKE no mecanismo do aplicativo de armazenamento de dados, mas a criação de um Arraylist faria o truque se você precisar pesquisar uma palavra em uma string.

 @Index public ArrayList searchName; 

e, em seguida, para pesquisar no índice usando objectify.

 List list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list(); 

e isso lhe dará uma lista com todos os itens que contêm o mundo que você fez na pesquisa

Se o LIKE '%text%' sempre se comparar a uma palavra ou poucas (pense em permutações) e seus dados mudarem lentamente (lentamente significa que não é proibitivamente caro – tanto em termos de preço quanto em termos de desempenho – criar e atualizar índices) A Entidade do Índice de Relação (RIE) pode ser a resposta.

Sim, você terá que criar uma entidade de armazenamento de dados adicional e preenchê-la adequadamente. Sim, existem algumas restrições que você terá que executar (um é o limite de 5000 no comprimento da propriedade da lista no armazenamento de dados do GAE). Mas as pesquisas resultantes são muito rápidas.

Para obter detalhes, consulte meu RIE com Java e Ojbectify e RIE com postagens do Python .

“Like” é frequentemente usado como substituto de um pobre homem para pesquisa de texto. Para pesquisa de texto, é possível usar o Whoosh-AppEngine .