MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb - Índice de texto múltiplo:padrão de chave de índice muito grande código de erro 67


O problema com sua estrutura sugerida:
{
 keyword" : "Just an example query", 
 "rankings" :
    [{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
     ...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
 ]}
}

É que embora agora você possa fazer
db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"}) 

e, em seguida, execute consultas como:
db.ranking.find({$text:{$search:"example1"}});

isso agora retornará todo o documento do array onde o elemento do array é correspondido.

Você pode querer considerar a referência para que cada resultado de classificação seja um documento separado e as palavras-chave e outros metadados sejam referenciados, para evitar a repetição de muitas informações.

Então, você tem um documento de palavras-chave/metadados como:
{_id:1, "keyword":"example query", "querydate": date, "other stuff":"other meta data"},
{_id:2, "keyword":"example query 2", "querydate": date, "other stuff":"other meta data 2"}

e, em seguida, um documento de resultados como:
{keyword_id:1, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
... keyword_id:1, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"},
 keyword_id:2, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
 ...keyword_id:2, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"}}

onde keyword_id liga de volta para (referências) a tabela de palavras-chave/metadados -- obviamente, na prática, os _ids serão parecidos com "_id":"519817e508a16b447c00020e", mas isso é apenas para facilitar a leitura. Agora você pode indexar em keyword_id, domain e href, juntos ou separadamente, dependendo dos tipos de consulta e você não obterá o index key pattern too large error e você obterá apenas um único documento correspondente em vez de uma matriz inteira retornada.

Não estou totalmente claro sobre onde você está precisando de pesquisas no estilo fuzzy/regex e se você estará pesquisando metadados ou apenas href e domínio, mas acho que essa estrutura deve ser uma maneira mais limpa de começar a pensar em indexação, sem maximizar os índices, como antes. Ele também permitirá que você combine achados em índices normais com índices de texto, dependendo do seu padrão de consulta.

Você pode encontrar esta resposta Relações do MongoDB:incorporação ou referência? útil ao considerar sua estrutura de documentos.