2017-07-20 4 views
0

Prenons ce document par exemple:Comment est-ce que j'interrogerais des clés de sorte qu'elles correspondent partiellement?

{ 
"id":1 
"planet":"earth-616" 
"data":[ 
    ["wolverine","mutant"], 
    ["Storm","mutant"], 
    ["Mark Zuckerberg","human"]] 
} 

J'ai créé un index de recherche pour indexer le nom et le type, par exemple si recherché pour nom: wolverine ou le type: mutant j'obtenir le document qui l'a. Mais selon mes besoins Je ne veux pas tout le document, je ne veux que ["wolverine","mutant"] J'ai créé une vue que les produits comme:

{ 
    "id":1, 
    "key":"earth-616", 
    "value":["earth-616","wolverine","mutant"] 
} 

J'ai découvert que je peux interroger uniquement avec des clés. (Est-il possible de créer des index de recherche sur les vues ?, Impossible de trouver quoi que ce soit dans la documentation) Ou devrais-je créer des vues avec celle ci-dessus comme ceci:

{ 
    "id":1, 
    "key":"wolverine", 
    "value":["earth-616","wolverine","mutant"] 
} 

Et

{ 
    "id":, 
    "key":"mutant" 
    "value":["earth-616","wolverine","mutant"] 
} 

De cette façon, je peux interroger avec les touches que je veux, mais je ne peux pas sembler correspondre partiellement les clés (ai-je manqué quelque chose?)

+0

Pourriez-vous définir ce qui est un indice de recherche? Faites-vous référence à Lucene Text search? En outre, avec votre structure de données actuelle, le type de requête que vous souhaitez obtenir sera difficile. Peut-être quelque chose comme ceci: people: [{"name": "Wolverine", "race": "mutant"}] serait plus propre et plus facile à interroger –

+0

@ AlexisCôté Oui, je fais référence à Lucene Text Search. "people: [{" name ":" wolverine "," race ":" mutant "}]" est beaucoup plus propre Je suis d'accord, mais c'est ce que je ** dois travailler avec. La meilleure solution que j'ai trouvée jusqu'ici dans ce but serait d'indexer chaque sous-chaîne d'une clé. Est-ce une mauvaise idée? Je suis très nouveau à ce sujet. –

Répondre

3

Si vous avez besoin de la sortie pour être exactement comme décrit alors je crois que vous devez utiliser des vues, et pour soutenir les recherches génériques, je crois que vous devrez indexer tous les sous-chaîne d'une clé. Une alternative est d'utiliser Cloudant Query, bien que vous ne puissiez pas obtenir la sortie exacte que vous recherchez. Si vous émettez une requête comme ceci:

{ 
    "selector": { 
    "_id": { 
     "$gt": 0 
    }, 
    "data": { 
     "$elemMatch": { 
     "$elemMatch": { 
      "$regex": "(?i)zuck" 
     } 
     } 
    } 
    }, 
    "fields": [ 
    "data" 
    ] 
} 

Le résultat sera l'ensemble de tableau de données:

{ 
    "data": [ 
    ["wolverine", "mutant"], 
    ["Storm", "mutant"], 
    ["Mark Zuckerberg", "human"] 
    ] 
}