Pesquisando no Firebase sem código do lado do servidor

Estou tentando fazer com que todos os usuários tenham o nome que contém uma determinada string do Firebase. Por exemplo, se eu tiver esses usuários:

Devid, Andy, Bob 

Eu gostaria de obter todos os usuários com o nome que contém um ‘D’, então eu espero isso como resultado:

 Devid, Andy 

Esta é a estrutura do meu Firebase no momento:

insira a descrição da imagem aqui

Como o Firebase faz distinção entre maiúsculas e minúsculas, criei um atributo name_ que contém o nome em minúsculas.

Usando startAt e endAt posso obter todos os usuários com o nome começando com uma string definida

 ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...); 

Mas isso me dá apenas os usuários com o nome que começa com uma determinada string, por exemplo, se o texto for ‘D’, recebo:

 Devid 

1) No momento em que minha consulta significa “me dê todos os usuários com nome_ que começa com uma determinada string”, há uma maneira de fazer com que signifique “me dê todos os usuários qual nome contém uma determinada string”? EDIT: NÃO

As consultas do Firebase não têm nada parecido com os operadores de pesquisa de texto completo. Para realizá-las, você precisará integrar um mecanismo de pesquisa de texto completo externo ou criar um esquema de indexação personalizado muito elaborado. Firebase e indexação / pesquisa

2) No momento eu não quero ter código do lado do servidor, o que pode ser uma maneira boa e eficiente para implementar índices personalizados?

obrigado

Ok – não há como fazer exatamente o que você quer com sua estrutura atual.

No entanto, isso só surgiu na minha cabeça:

 users: user_1234 first_name: "Devid" components: "D": true "e": true "v": true "i": true "d": true user_5678 first_name: "Andy" components: "A": true "n": true "d": true "y": true user_1010 first_name: "Bob" components: "B": true "o": true "b": true 

e aqui está um código ObjC para fazer isso acontecer (e foi testado!)

 Firebase *ref = [myRootRef childByAppendingPath:@"users"]; FQuery *q1 = [ref queryOrderedByChild:@"components/b"]; FQuery *q2 = [q1 queryEqualToValue:@1]; [q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { NSLog(@"%@", snapshot.value); }]; 

Este código retorna Bob.

Para obter todas as pessoas ‘d’, mude os “componentes / b” para “componentes / d”

Editar:

Você pode ficar realmente louco e adicionar mais combinações para expandir sua capacidade de pesquisa

 users: user_1234 first_name: "Devid" components: "D": true "e": true "v": true "i": true "d": true "De": true "Dev": true "Devi": true "Devid": true "ev": true "evi": true "evid": true ... etc 

Seria muito simples codificar algumas linhas de código para iterar o nome e escrever as combinações.

Obviamente, seria muito mais eficiente (se você tiver um dataset limitado) apenas ler todos os primeiros nomes no instantâneo, despejá-los em um array e (em ObjC) usar um NSPredicate para extrair o que você precisa.

biblioteca oxyzen no github faz isso que você faz inserções e atualizações com alguns Firebase embrulhado

para a parte de indexação basicamente a function:

  1. JSON vincula um documento.
  2. remove todos os nomes de propriedade e JSON para aguardar apenas os dados (regex).
  3. remove todas as tags xml (portanto, também html) e os atributos (lembre-se de orientação antiga, “os dados não devem estar em atributos xml”) para deixar apenas o texto puro se xml ou html estivesse presente.
  4. remove todos os caracteres especiais e substitui com espaço (regex)
  5. substitui todas as instâncias de múltiplos espaços por um espaço (regex)
  6. divide em espaços e ciclos:
  7. para cada palavra adiciona refs ao documento em alguma estrutura de índice em seu db que basicamente contém filhos nomeados com palavras com childs nomeadas com uma versão de escape de “ref / inthedatabase / dockey”
  8. em seguida, insere o documento como um aplicativo normal do Firebase faria

na implementação do oxyzen, atualizações subsequentes do documento REALMENTE lê o índice e o atualiza, removendo as palavras que não combinam mais e adicionando as novas.

pesquisas subsequentes de palavras podem facilmente encontrar documentos nas palavras filho. pesquisas de palavras múltiplas são implementadas usando hits