SQL Connect की मदद से, पूरे टेक्स्ट में खोज करना

Firebase SQL Connect में फ़ुल-टेक्स्ट सर्च की सुविधा उपलब्ध है. यह PostgreSQL की मदद से काम करती है. फ़ुल-टेक्स्ट सर्च की मदद से, बड़े डेटासेट में मौजूद जानकारी को तुरंत और आसानी से ढूंढा जा सकता है. इसके लिए, एक साथ कई कॉलम में कीवर्ड और वाक्यांशों को खोजा जाता है.

अपनी सेवा में फ़ुल-टेक्स्ट सर्च की सुविधा जोड़ी जा सकती है. सबसे पहले, अपने स्कीमा में मौजूद उस String में @searchable डायरेक्टिव जोड़ें जिसे आपको खोजना है. उदाहरण के लिए:

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

इस डायरेक्टिव को जोड़ने के बाद, क्वेरी में <pluralType>_search फ़ील्ड जोड़कर, फ़ुल-टेक्स्ट खोज की जा सकती है. इस मामले में, यह movies_search होगा:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

पूरे टेक्स्ट की खोज के नतीजों को बेहतर बनाना

@searchable डायरेक्टिव और _search फ़ील्ड में आर्ग्युमेंट जोड़कर, फ़ुल-टेक्स्ट खोज के नतीजों को बेहतर बनाया जा सकता है;

शेयर किए गए आर्ग्युमेंट

खोज के नतीजों को कंट्रोल करने के लिए, बुनियादी सूची वाले फ़ील्ड <pluralType> में इस्तेमाल किए गए कई एक जैसे आर्ग्युमेंट का इस्तेमाल किया जा सकता है:

  • order की मदद से, नतीजों का क्रम बदला जा सकता है. अगर इसे शामिल नहीं किया जाता है, तो नतीजे, काम के होने के हिसाब से घटते क्रम में दिखाए जाएंगे.
  • where की मदद से, खोज के लिए अतिरिक्त फ़िल्टर जोड़े जा सकते हैं. उदाहरण के लिए, सिर्फ़ किसी खास शैली की फ़िल्में खोजें.
  • limit का इस्तेमाल करने पर, क्वेरी के जवाब में सिर्फ़ टॉप X नतीजे दिखते हैं.
  • offset से क्वेरी, शुरुआती X नतीजों को स्किप कर देती है.
  • distinct जनरेट किए गए एसक्यूएल में DISTINCT ऑपरेटर जोड़ता है.

भाषा चुनने का विकल्प

डिफ़ॉल्ट रूप से, पूरा टेक्स्ट खोजने की सुविधा, दस्तावेज़ों को अंग्रेज़ी में पार्स करती है. @searchable डायरेक्टिव पर भाषा आर्ग्युमेंट का इस्तेमाल करके, इसे बदला जा सकता है:

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

सही भाषा चुनने से, PostgreSQL सटीक लेक्सिकल स्टेमिंग कर पाएगा. इससे यह पक्का करने में मदद मिलेगी कि आपकी खोज में काम के नतीजे न छूटें. अगर आपको एक से ज़्यादा कॉलम में खोजना है, तो उन सभी को एक ही भाषा में सेट करना होगा.

भाषाएं
  • सरल
  • arabic
  • armenian
  • बैस्क
  • catalan
  • डैनिश
  • डच
  • इंग्लिश
  • एस्टोनियन
  • फ़िनिश
  • फ़्रेंच
  • जर्मन
  • greek
  • hindi
  • हंगेरियन
  • इंडोनेशियन
  • irish
  • italian
  • लिथुआनियन
  • नेपाली
  • norwegian
  • पॉर्चुगीज़
  • romanian
  • russian
  • serbian
  • स्पैनिश
  • स्वीडिश
  • तमिल
  • turkish
  • यिदिश

हम उन सभी भाषाओं के साथ काम करते हैं जिनमें PostgreSQL की फ़ुल-टेक्स्ट सर्च की सुविधा काम करती है. psql का इस्तेमाल करके, यहां दी गई क्वेरी से पूरी सूची पाई जा सकती है.

SELECT cfgname FROM pg_ts_config;

क्वेरी का फ़ॉर्मैट

डिफ़ॉल्ट रूप से, फ़ुल-टेक्स्ट सर्च की सुविधा, क्वेरी के लिए वेब सिमैंटिक का इस्तेमाल करती है. यह Google Search की तरह ही काम करती है. फ़ील्ड पर queryFormat आर्ग्युमेंट का इस्तेमाल करके, इस व्यवहार को बदला जा सकता है.<pluralType>_search

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

क्वेरी फ़ॉर्मैट के चार विकल्प होते हैं:

  • QUERY, वेब सर्च इंजन को जाने-पहचाने सिमैंटिक देता है. जैसे, कोट की गई स्ट्रिंग, AND, और OR. यह डिफ़ॉल्ट रूप से चुना गया होता है.
  • PLAIN में, सभी शब्दों का मिलान होता है. हालांकि, यह ज़रूरी नहीं है कि वे एक साथ हों ("brown dog" का मिलान " the brown and white dog" या "the white and brown dog" से होगा).
  • PHRASE, किसी वाक्यांश से मेल खाता है. जैसे, "brown dog" से "the white and brown dog" मेल खाएगा, लेकिन "brown and white dog" मेल नहीं खाएगा.
  • ADVANCED की मदद से, tsquery ऑपरेटर के पूरे सेट का इस्तेमाल करके मुश्किल क्वेरी बनाई जा सकती हैं.

कितने काम का है, इसका थ्रेशोल्ड

'कितने काम के हैं' थ्रेशोल्ड सेट करने का मतलब है कि आपकी खोज के नतीजे सिर्फ़ एक तय थ्रेशोल्ड से ऊपर की वैल्यू वाले होंगे. ज़्यादातर मामलों में, आपको इसे सेट करने की ज़रूरत नहीं होगी. जिस भी नतीजे की काम की वैल्यू 0 से ज़्यादा होगी वह काम का नतीजा होगा.

हालांकि, अगर आपको लगता है कि खोज के नतीजे आपके काम के नहीं हैं, तो काम के होने के थ्रेशोल्ड की मदद से उन्हें फ़िल्टर किया जा सकता है.

मिलते-जुलते होने के थ्रेशोल्ड के लिए सही वैल्यू का पता लगाने के लिए, आपको कुछ टेस्ट खोजें करनी चाहिए और _metadata.relevance को देखना चाहिए:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

ऐसा थ्रेशोल्ड चुनें जिससे आपको लगता है कि काम के नतीजे नहीं मिल रहे हैं. इसके लिए:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

फ़ुल-टेक्स्ट सर्च, वेक्टर सिमिलैरिटी सर्च, और स्ट्रिंग पैटर्न फ़िल्टर में से कोई एक चुनें

SQL Connect आपको अपने डेटाबेस में खोजने के लिए कुछ अलग-अलग तरीके उपलब्ध कराता है.

इस टेबल का इस्तेमाल करके, अपनी ज़रूरत के हिसाब से सही विकल्प चुनें.

पूरे टेक्स्ट में खोज करने की सुविधा वेक्टर के आधार पर मिलती-जुलती खोज करने की सुविधा स्ट्रिंग पैटर्न फ़िल्टर
सामान्य खोज की सुविधा लागू करने के लिए बेहतर यह सुविधा, सिमैंटिक तौर पर मिलती-जुलती लाइनों को ढूंढने के लिए अच्छी है. उदाहरण के लिए, सुझाव या 'इस तरह के और') यह फ़ंक्शन, टेक्स्ट के सटीक मिलान या रेगुलर एक्सप्रेशन सर्च के लिए अच्छा है
यह लेक्सिकल स्टेमिंग करता है. इससे एक ही शब्द के अलग-अलग फ़ॉर्म या टेंस को मैच करने में मदद मिलती है इसके लिए, Vertex AI का इस्तेमाल करना ज़रूरी है इसमें सबसे कम मेमोरी और डिस्क स्पेस का इस्तेमाल होता है, क्योंकि इसमें किसी इंडेक्स या जनरेट किए गए कॉलम की ज़रूरत नहीं होती
किसी टेबल के एक से ज़्यादा कॉलम पर लागू किया जा सकता है यह फ़ंक्शन, एक बार में सिर्फ़ एक कॉलम के लिए काम करता है OR फ़िल्टर का इस्तेमाल करके, टेबल के एक से ज़्यादा कॉलम पर लागू किया जा सकता है
बड़े दस्तावेज़ों पर बेहतर परफ़ॉर्मेंस बड़े दस्तावेज़ों पर बेहतर परफ़ॉर्मेंस बड़े दस्तावेज़ों को खोजते समय, इसकी परफ़ॉर्मेंस कम हो जाती है
यह जनरेट किए गए कॉलम और हर खोज के लिए इंडेक्स को सेव करने के लिए, मेमोरी और स्टोरेज ओवरहेड जोड़ता है