Pergunta

Eu estou usando o Google App Engine (Java) com JDO. Como posso fazer o equivalente JDO de

select * from table where field like '%foo%'

A única recomendação que eu tenho visto até agora é usar Lucene. Eu sou o tipo de surpresa que algo deste básica não é possível em out-of-the-box GAE.

Foi útil?

Solução

Você pode não substring pesquisas desse tipo no App Engine. A razão para isto é que o armazenamento de dados do Google App Engine é construído para ser escalável, e se recusa a executar qualquer consulta que não pode satisfazer com um índice. Indexação de uma consulta como esta é quase impossível, porque exige pesquisar a totalidade da propriedade 'field' de cada recorde para um jogo. Qualquer banco de dados relacional que você executar essa consulta on irá executá-lo, fazendo uma varredura completa da tabela e verificar cada registro individualmente -. Unscalable, para dizer o mínimo

A solução, como você já descobriu, é usar a indexação de texto completo, como Lucene. Existem bibliotecas para executar Lucene no App Engine, como GAELucene . Isto também lhe dá o poder de pesquisa de texto completo adequada, em vez de correspondência de substring ingênuo.

Outras dicas

tl; dr :. Gerencie sua própria propriedade de pesquisa de valor de múltiplas e executar equals consultas contra ele

Detalhes: Para aqueles que procuram simples algo e DIY, você pode fazer o seguinte:

  1. Na sua entidade, crie uma propriedade com valores múltiplos searchTerms. Este irá conter itens pesquisáveis ??da entidade.

  2. Dividir texto pesquisável de sua entidade em palavras. Estas palavras serão apenas peças pesquisáveis ??da entidade. Você poderia começar por divisão de espaços em branco, ou você pode adicionar algum decorrente básico. Por exemplo. quando se lida com endereços de e-mail que você pode querer colocar as peças do usuário e de domínio em separado para que ambos possam ser pesquisados. Se a sua entidade é atualizado você vai precisar para reconstruir esta propriedade.

  3. Para realizar uma busca, dividir a entrada de pesquisa em palavras (realizando básica decorrente se necessário), e adicionar cada um como um filtro usando o operador contra a propriedade searchTerms iguais.

    (o operador = em uma propriedade de vários valores pergunta se qualquer valor é igual ao filtro.)

    por exemplo, (Usando Objectify ):

    Query query = dao.ofy().query(Recipe.class);
    for (String term : search.toLowerCase().split(" ")) {
      query = query.filter("searchTerms =", term);
    }
    

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