Problem z sugerowaną strukturą:
{
keyword" : "Just an example query",
"rankings" :
[{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
]}
}
Czy tak jest, chociaż teraz możesz to zrobić
db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"})
a następnie uruchamiaj zapytania takie jak:
db.ranking.find({$text:{$search:"example1"}});
to teraz zwróci cały dokument tablicy, w którym pasuje element tablicy.
Możesz rozważyć odwoływanie się, aby każdy wynik rankingu był osobnym dokumentem, a słowa kluczowe i inne metadane były przywoływane, aby uniknąć powtarzania wielu informacji.
Masz więc dokument zawierający słowa kluczowe/metadane, taki jak:
{_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"}
a następnie dokument z wynikami, taki jak:
{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"}}
gdzie Keyword_id łączy się z (odwołaniami) do tabeli słów kluczowych/metadanych -- oczywiście w praktyce identyfikatory _id będą wyglądać jak "_id" :"519817e508a16b447c00020e", ale to tylko dla czytelności. Możesz teraz indeksować słowa kluczowe id, domenę i href, razem lub osobno, w zależności od typów zapytań, a nie otrzymasz index key pattern too large error
i otrzymasz tylko jeden pasujący dokument, a nie całą zwróconą tablicę.
Nie jestem do końca jasny, gdzie potrzebujesz wyszukiwań w stylu rozmytym/regex i czy będziesz przeszukiwać metadane, czy tylko href i domenę, ale myślę, że ta struktura powinna być czystszym sposobem na rozpoczęcie myślenia o indeksowaniu, bez maksymalizacji indeksów, jak wcześniej. Umożliwi to również łączenie wyników wyszukiwania w normalnych indeksach z indeksami tekstowymi, w zależności od wzorca zapytania.
Możesz znaleźć tę odpowiedź Relacje MongoDB:osadzanie czy odniesienie? przydatne przy rozważaniu struktury dokumentu.