Metin arama özelliğini kullanma

Bir koleksiyondaki belirli dizeleri aramak için Cloud Firestore metin arama özelliklerini kullanın.

Başlamadan önce

Metin sorgularını kullanmaya başlamadan önce aşağıdakileri yapın:

  1. Mevcut bir MongoDB uyumlu işlemler veritabanına erişiminiz olduğundan veya bir veritabanı oluşturup bu veritabanına bağlandığınızdan emin olun.

  2. Metin dizininizin olduğundan emin olun veya metin dizini oluşturun.

IAM izinleri

Cloud Firestore içinde dizin oluşturmak için aşağıdaki rollerden birinin size atandığından emin olun:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Rol vermek için Tek bir rol verme başlıklı makaleyi inceleyin. Cloud Firestore rolleri ve ilişkili izinler hakkında daha fazla bilgi için Önceden tanımlanmış roller başlıklı makaleyi inceleyin.

Özel roller tanımladıysanız dizin oluşturmak için aşağıdaki izinlerin tümünü atayın:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Metin sorgusu çalıştırma

Metin sorgularında filtre içinde $text operatörü kullanılır. Sorgulanan dizeyi $search bağımsız değişkeninde belirtin.

Genel metin sorgusu çalıştırma

Genel bir sorgu yapmak için aşağıdaki sorguyu çalıştırın:

  # Find query
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

Dizininiz bölümlendirilmişse sorgunuzda bölümü bir "ve" eşitlik filtresine dahil ederek bölüme göre filtreleme yapabilirsiniz. Örneğin, city bölümünüz varsa bir metin sorgusunu aşağıdaki gibi filtreleyebilirsiniz:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

Ayrıca, bir toplamayı bölüme göre de filtreleyebilirsiniz. Örneğin:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

Bölümünüzün değeri bir dize olmalıdır. Bölümlendirme filtreniz, "and" kullanılarak sorgunuza birleştirilmelidir.

Sorgu dilini ayarlama

$language bağımsız değişkenini kullanarak sorgu dilini ayarlayabilirsiniz. Örneğin:

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

Sorgu dilini ayarlamazsanız sorgu, metin dizininin dilini kullanır.

Tam bir terimi sorgulama

Tam bir terimi sorgulamak için terimi çift tırnak içine alınmış bir kelime dizisi olarak yapılandırın. Örneğin:

  # Find query
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

Terim kombinasyonu sorgulama

Sorgunuzu daha hassas hale getirmek için bir terim zinciri belirtin. Örneğin, aşağıdaki sorgu, best AND french AND ("bread" OR "is") kombinasyonuyla eşleşen dokümanları döndürür:

  # Find query
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

Bir terimi hariç tutma

Bir terimi sorgudan hariç tutmak için terimin başına kısa çizgi (-) ekleyin:

  # Find query
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

Alaka düzeyi puanını hesaplama

Metin sorgusuyla eşleşen dokümanların alaka düzeyini hesaplamak için {$meta: "textScore"} ifadesini kullanın. Sonuçları azalan puan sırasına göre sıralamak için sıralama ifadesinde $meta kullanın. Puan değerini depolamak için kullanılan alanın adı SCORE_FIELD olmak üzere aşağıdaki örnekleri inceleyin:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

Metin puanını tahmin ifadelerinde de kullanabilirsiniz. Örneğin:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

Sorguyu genişletme

$text operatörü, sorgu sonuçlarının alaka düzeyini artırmak için arama dizesini belirtilen dile göre genişleterek bağlama duyarlı eş anlamlılar, kök biçimler, yazım hatası düzeltilmiş terimler, aksanlı harf varyasyonları ve daha fazlası için eşleşmeler içerir.

Sınırlamalar

  • $near operatörleri ve $text operatörleri aynı sorguda kullanılamaz.
  • find veya aggregation sorgusu başına tek bir $text operatörüne izin verilir.
  • Toplama işlemlerinde, $text içeren $match aşaması ilk ardışık düzen aşaması olmalıdır.
  • $text yalnızca $and ve $or içinde iç içe yerleştirilebilir.
  • $text, $or içinde yer alıyorsa arama dışı ayrıklar, sorguyu optimize etmek için mevcut sıralı dizinleri kullanabilir. Diğer ayrıklar dizine eklenmemişse sorgu, koleksiyon taramasına dayanır.
  • $text, sorgu ipuçlarıyla kullanılamaz.
  • Metin araması içeren sorgular $natural ile sıralanamaz.