Inicio » Uncategorized » Busquedas tipo like en mongodb

Busquedas tipo like en mongodb

A partir de mongodb 2.6 aparecen los índices tipo text que permiten hacer búsquedas tipo like. Hay que tener en cuenta que esto índices no indexaran algunas palabras dependiendo del idioma. Os adjunto un pequeño ejemplo:

Creamos la colección foo con dos documentos:

db.foo.insert({desc: "This is a string with text"});

db.foo.insert({desc:"This is a another string with Text"});

Creamos un indice sobre desc tipo text, sin especificar idioma.

db.foo.ensureIndex({"desc":"text"});

db.foo.getIndexes()

[

        {

                "v" : 1,

                "key" : {

                        "_id" : 1

                },

                "name" : "_id_",

                "ns" : "admin.foo"

        },

        {

                "v" : 1,

                "key" : {

                        "_fts" : "text",

                        "_ftsx" : 1

                },

                "name" : "desc_text",

                "ns" : "admin.foo",

                "weights" : {

                        "desc" : 1

                },

                "default_language" : "english",

                "language_override" : "language",

                "textIndexVersion" : 2

        }

]

Como vemos por defecto lo crea en ingles.

Hacemos algunas búsquedas, como vemos por las stop words no encontramos resultados:

db.foo.find({ $text:{ $search:"this" } });

db.foo.find({ $text:{ $search:"text" } });

{ "_id" : ObjectId("5810773579d890f4da883876"), "desc" : "This is a another string with Text" }

{ "_id" : ObjectId("5810772c79d890f4da883875"), "desc" : "This is a string with text"

Borramos el índice y lo recreamos para español

db.foo.dropIndex({ "_fts" : "text",

...                         "_ftsx" : 1})

{ "nIndexesWas" : 2, "ok" : 1 }

db.foo.ensureIndex({"desc":"text"}, { default_language: "spanish" })

{

        "createdCollectionAutomatically" : false,

        "numIndexesBefore" : 1,

        "numIndexesAfter" : 2,

        "ok" : 1

}

db.foo.find({ $text:{ $search:"is" } });

{ "_id" : ObjectId("5810773579d890f4da883876"), "desc" : "This is a another string with Text" }

{ "_id" : ObjectId("5810772c79d890f4da883875"), "desc" : "This is a string with text" }

db.foo.find({ $text:{ $search:"This" } });

{ "_id" : ObjectId("5810773579d890f4da883876"), "desc" : "This is a another string with Text" }

{ "_id" : ObjectId("5810772c79d890f4da883875"), "desc" : "This is a string with text" }

Al hacer las mismas búsquedas obtenemos resultados diferentes, porque las stop words dependen del idioma.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s