Pergunta

Simples, na verdade.No SQL, se eu quiser pesquisar alguns caracteres em um campo de texto, posso fazer:

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

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

Foi útil?

Solução

O BigTable, que é o back-end do banco de dados do App Engine, será dimensionado para milhões de registros.Devido a isso, o App Engine não permitirá que você faça nenhuma consulta que resulte em uma verificação de tabela, pois o desempenho seria péssimo 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 que você faz e adiciona automaticamente quaisquer índices ausentes ao seu index.yaml arquivo.

Não há como indexar um LIKE consulta, então simplesmente não está disponível.

Tenha um relógio de esta sessão do Google IO para uma explicação muito melhor e mais detalhada disso.

Outras dicas

estou enfrentando o mesmo problema, mas encontrei algo nas páginas do Google App 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 string que começa com os caracteres abc.A string Unicode u"\ufffd" representa o maior caractere Unicode possível.Quando os valores das propriedades são classificados em um índice, os valores que se enquadram nesse intervalo são todos os valores que começam com o prefixo fornecido.

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

talvez isso possa resolver o problema ;)

Embora o App Engine não suporte consultas LIKE, dê uma olhada nas propriedades ListaPropriedade e StringListProperty.Quando um teste de igualdade é feito nessas propriedades, o teste será aplicado em todos os membros da lista, por exemplo, list_property = value testa se o valor aparece em qualquer lugar da lista.

Às vezes, esse recurso pode ser usado como solução alternativa para a falta de consultas LIKE.Por exemplo, permite fazer pesquisa de texto simples, conforme descrito nesta postagem.

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

Gaélico fornece linguagem específica de domínio para executar mais consultas de pesquisa fáceis de usar.Por exemplo, o trecho a seguir encontrará os primeiros dez livros classificados a partir dos mais recentes com título contendo ferne o gênero corresponde exatamente thriller:

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 é escrito como o operador de correspondência do Groovy =~.Ele suporta funções como distance(geopoint(lat, lon), location) também.

O mecanismo de aplicativo lançou um aplicativo de uso geral serviço de pesquisa de texto completo 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 em Objectificar aqui , é como uma API de acesso ao Datastore.Há um FAQ com esta pergunta especificamente, aqui está a resposta

Como faço uma consulta semelhante (LIKE "foo%")
Você pode fazer algo como startWith ou endWith se inverter a ordem quando armazenado e pesquisado.Você faz uma consulta de intervalo com o valor inicial desejado e um valor logo acima daquele 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/iniciar.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 subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

Testei isso com a API Java de baixo nível do GAE Datastore.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' é reunir todos os resultados de uma consulta '>=' e, em seguida, repetir os resultados em python (ou Java) para elementos contendo o que você estou procurando.

Digamos que você queira filtrar usuários com q='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 de aplicativo de armazenamento de dados; no entanto, criar um Arraylist resolveria o problema se você precisar pesquisar uma palavra em uma string.

@Index
    public ArrayList<String> searchName;

e depois pesquisar no índice usando objectify.

List<Profiles> 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 compara a uma palavra ou algumas (pense em permutações) e seus dados mudam lentamente (lentamente significa que não é proibitivamente caro - tanto em termos de preço quanto de desempenho - criar e atualizar índices), então a Entidade de Í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 contornar (uma é o limite de 5.000 no comprimento da propriedade da lista no armazenamento de dados do GAE).Mas as pesquisas resultantes são extremamente rápidas.

Para detalhes veja meu RIE com Java e Ojbectify e RIE com Python Postagens.

"Curtir" é frequentemente usado como um substituto para a pesquisa de texto pelos pobres.Para pesquisa de texto, é possível usar Whoosh-AppEngine.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top