5

Env: Mongos ileMongoDB Tam ve Kısmi Metin Arama

  • MongoDB (3.2.0)

Koleksiyonu:

  • kullanıcıları

Metin Endeksi oluşturma:

BasicDBObject keys = new BasicDBObject(); 
    keys.put("name","text"); 

    BasicDBObject options = new BasicDBObject(); 
    options.put("name", "userTextSearch"); 
    options.put("unique", Boolean.FALSE); 
    options.put("background", Boolean.TRUE); 

    userCollection.createIndex(keys, options); // using MongoTemplate 

Belge:

  • { "name": "LEONEL"}

Sorgular:

BULUNAMADI =>
  • db.users.find({ "$text" : { "$search" : "LEONEL" } })
  • db.users.find({ "$text" : { "$search" : "leonel" } }) => BULUNDU (arama CaseSensitive false)
  • db.users.find({ "$text" : { "$search" : "LEONÉL" } }) => BULUNDU
  • db.users.find({ "$text" : { "$search" : "LEONE" } }) => BULUNDU (Kısmi arama)
  • db.users.find({ "$text" : { "$search" : "LEO" } }) => BULUNAMADI (Kısmi arama)
  • db.users.find({ "$text" : { "$search" : "L" } }) => BULUNAMADI (Kısmi arama)
(diacriticSensitive ile arama yanlıştır)

Neden "LEO" veya "L" sorgusunu kullanarak 0 sonuç aldığım hakkında bir fikriniz var mı?

Metin Dizini ile düzenli sorgulama Aramaya izin verilmiyor.

db.getCollection('users') 
    .find({ "$text" : { "$search" : "/LEO/i", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
    .count() // 0 results 

db.getCollection('users') 
    .find({ "$text" : { "$search" : "LEO", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
.count() // 0 results 

Mongo Belgeleri: MongoDB 3.4 itibariyle

+0

Olası kopyası [MongoDB: Büyük/küçük harfe duyarlı bir sorgu oluşturmak mümkün mü?] (Https://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case- duyarsız sorgu) –

+0

Bu soru, bir metin dizini kullanarak ve büyük/küçük harfe duyarlı arama kullanılmayan kısmi arama ile ilgilidir. @LucasCosta lütfen bu soruyu kopyalanmış olarak etiketlemeyin. – Leonel

+0

Bu mümkün, en az 5 oy gerekiyor @Leonel –

cevap

10

, text search özelliği, metin içeriğinde büyük/küçük harfe duyarlı aramaları engellemeye ve yönlendirmeye yönelik dile özgü kurallarla desteklemek için tasarlanmıştır. supported languages için kodlama kuralları, genellikle ortak fiilleri ve isimleri işleyen, ancak uygun isimlerden habersiz standart algoritmalara dayanmaktadır.

Kısmi veya bulanık eşleşmeler için açık destek yoktur, ancak benzer bir sonuca neden olan terimler bu şekilde çalışıyor gibi görünebilir. Örneğin: "tadı", "tadı" ve zevkli "hepsi" tadı "dır. Daha fazla sözcükle ve algoritmalarla denemeler yapmak için Snowball Stemming Demo sayfasını deneyin.

Eşleşen sonuçlarınız, aynı kelimedeki tüm varyasyonlardır" LEONEL ", sadece durum ve aksan ile değişir." LEONEL ", seçtiğiniz dilin kurallarına göre daha kısa bir şeye eklenemezse, bunlar eşleşecek tek çeşit varyasyonlardır.

Eğer verimli Kısmi eşleşmeleri yapmak istiyorsanız farklı bir yaklaşım gerekir. bazı yararlı fikirler için bkz: SERVER-15090: Improve Text Indexes to support partial word match:

ederek MongoDB sorun izleyicide/upvote izleyebilirsiniz ilgili bir gelişme isteği vardır.

İlgili konular