Atlas Search

Tomasz Niegowski

Atlas Search to wyszukiwanie pełnotekstowe w MongoDB Atlas. Zapewnia płynne i skalowalne środowisko tworzenia funkcji aplikacji opartych na trafności. Do czego się je wykorzystuje? Eliminuje ono potrzebę uruchamiania oddzielnego systemu wyszukiwania obok bazy danych. Upraszcza też architekturę danych, więc nie musisz się martwić o synchronizację. Z tekstu dowiesz się, jakie są możliwości tego produktu i jak zacząć z niego korzystać.

Wstęp

Aplikacja ma jakiś rodzaj funkcji wyszukiwania z nowoczesną „jakością i sposobem działania”? Zazwyczaj wyróżniają ją też poniższe funkcjonalności:

  • dopasowanie rozmyte (tolerancja literówek),
  • podkreślanie,
  • aspekty,
  • punktacja / ważenie,
  • synonimy,
  • autouzupełnianie.

Zwykle znajdujemy je w nowoczesnych pasekach wyszukiwania. Żadna z nich nie jest dostępna w tradycyjnych bazach transakcyjnych.

Jak to się zwykle robi? Najpierw mamy tradycyjną bazę transakcyjną, która ma wiele funkcjonalności typowych dla tego typu baz danych (CRUD, strumienie zmian, agregacje, indeksy wtórne itp.). Potem musimy dodać oddzielną wyszukiwarkę, więc potrzebujemy osobnego magazynu danych. Dobrymi przykładami wyszukiwarek są Elasticsearch czy Solr oparte na projekcie Apache o nazwie Lucene Project, który jest biblioteką Javy. Magazyn umożliwia tworzenie odwróconych indeksów.

Niezbędne dla nas jest, aby oba te mechanizmy współpracowały. Musimy więc synchronizować dane przechowywane w obu z nich. Może to wygenerować dość duże koszty ogólne. Atlas oferuje ujednoliconą bazę danych i wyszukiwanie. Mamy w nim tradycyjną bazę transakcyjną oraz zintegrowaną funkcjonalność wyszukiwarki.

Wyszukiwanie

Atlas Search to funkcja wyszukiwania pełnotekstowego osadzona w MongoDB Atlas. Zapewnia ona płynne i skalowalne środowisko tworzenia funkcji aplikacji opartych na trafności. Opiera się ona na Apache Lucene i eliminuje potrzebę uruchamiania oddzielnego systemu wyszukiwania obok bazy danych. Zalety? Upraszcza architekturę danych, więc nie musisz się martwić o synchronizację. Dodatkowo jest to w pełni zarządzana platforma oferowana jako jeden produkt.

Jak uruchamiać zapytania względem indeksu wyszukiwania Atlas?

Przeanalizujmy kolekcję movies w bazie danych sample_movies z poniższym schematem:

{
  _id: ObjectId,
  title: String,
  year: Int
  runtime: Int
  released: Date
  plot: String
  lastUpdated: Date
  type: String,
  directors: String[],
  countries: String[]
}

Krok pierwszy – tworzenie indeksu wyszukiwania

Możesz utworzyć indeks wyszukiwania Atlas dla kolekcji w klastrze Atlas. Jak to zrobić? Z pomocą interfejsu użytkownika Atlas, interfejsu API MongoDB Atlas Administration, interfejsu CLI Atlas lub Terraform. Ponieważ jest to przykład startowy, utworzysz indeks wyszukiwania Atlas przy użyciu interfejsu użytkownika Atlas ze wszystkimi ustawieniami domyślnymi.

Postępuj według poniższych wskazówek:

  • Przejdź do strony Atlas Cluster Overview i kliknij nazwę Twojego klastra.
  • Wciśnij zakładkę Search.
  • Wciśnij Create Search Index.
  • Wybierz Configuration Method → na pierwszy raz sugeruję edytor wizualny → następnie wciśnij Next.
  • Wprowadź nazwę indeksu w Index Name i ustaw Database and Collection (domyślna nazwa indeksu to default – możesz ją pozostawić bez zmian i wtedy nie musisz podawać nazwy indeksu podczas pisania zapytania).
  • Przejrzyj domyślne ustawienia konfiguracji indeksu Atlas Search w sekcji Index Configuration – na razie pozostaw wszystkie ustawienia domyślne.
  • Kliknij Create Search Index.
  • Zamknij okienko You’re All Set!
  • Sprawdź stan.

Nowo utworzony indeks pojawi się w zakładce Search. Podczas jego tworzenia w polu Status wyświetlany jest komunikat o budowie w toku. Po zakończeniu tworzenia indeksu pojawi się w nim komunikat Active.

Podczas tworzenia indeksu ze wszystkimi ustawieniami domyślnymi definicja indeksu powinna wyglądać tak:

{
    "mappings": {
        "dynamic": true
    }
}

Możesz utworzyć indeks wyszukiwania Atlas Search, który będzie korzystał z mapowań dynamicznych lub statycznych. Domyślne mapowania dynamiczne oznaczają, że Atlas Search automatycznie indeksuje pola obsługiwanych typów w każdym dokumencie. Indeksy mapowane dynamicznie zajmują więcej miejsca na dysku niż indeksy mapowane statycznie. Mogą być też mniej wydajne. Jeśli myślisz jednak o eksperymentowaniu z Atlas Search, jest to bardzo dobra opcja.

Krok drugi – uruchamianie zapytań wyszukiwania Atlas

Połącz się ze swoim klastrem w powłoce MongoDB. Opcjonalnie znajdź opcję Search Tester po kliknięciu nazwy indeksu w Atlasie. Napisz następujące zapytanie:

db.movies.aggregate([
  {
    $search: {
      "text": {
        "query": "baseball",
        "path": "plot"
      }
    }
  },
  {
    $limit: 5
  },
  {
    $project: {
      "_id": 0,
      "title": 1,
      "plot": 1
    }
  }
])

Wyszukuje ono słowo baseball w polu wykresu. Zawiera etap $limit ograniczający wynik do pięciu, a także etap $projekt, który wyklucza wszystkie pola z wyjątkiem tytułu i fabuły.

Przeanalizujmy nieco bardziej zaawansowany przykład. $search ma kilka operatorów do konstruowania różnych typów zapytań. Jednym z najpopularniejszych jest operator złożony (compound), który łączy kilka operatorów w jedno zapytanie. Ma on taką składnię:

{
  $search: {
    "index": <index name>, // optional, defaults to "default"
    "compound": {
      <must | mustNot | should | filter>: [ { <clauses> } ],
      "score": <options>
    }
  }
}

Zwróć uwagę, że must odwzorowuje operator AND boolean, a mustNot operator AND NOT boolean.

Pora, aby napisać zapytanie z poniższymi kryteriami wyszukiwania:

  1. Pole plot musi zawierać Hawaii lub Alaska oraz czterocyfrową liczbę, np. rok.
  2. Pole title nie może zawierać słów Beach ani Snow.
db.movies.aggregate([
  {
    $search: {
      "compound": {
        "must": [ {
          "text": {
            "query": ["Hawaii", "Alaska"],
            "path": "plot"
          },
        },
        {
          "regex": {
            "query": "([0-9]{4})",
            "path": "plot",
            "allowAnalyzedField": true
          }
        } ],
        "mustNot": [ {
          "text": {
            "query": ["Beach", "Snow"],
            "path": "title"
          }
        } ]
      }
    }
  },
  {
    $project: {
      "title": 1,
      "plot": 1,
      "_id": 0
    }
  }
])

Podsumowanie

Jak widzisz, rozpoczęcie korzystania z Atlas Search jest bardzo łatwe. Jeśli już używasz MongoDB i wiesz, jak pisać pipeline’y agregacji, tworzenie zapytań wykorzystujących Atlas Search nie będzie dla Ciebie wyzwaniem. Dlaczego? Ponieważ jest jednym z etapów w agregacji $search. Powyższe przykłady to podstawa, dzięki której będziesz w stanie „bawić się” Atlas Search i wypróbować wszystkie fajne, zaawansowane funkcje wyszukiwania.

Odnośniki

Poznaj mageek of j‑labs i daj się zadziwić, jak może wyglądać praca z j‑People!

Skontaktuj się z nami