2013-04-13 20 views
6

Używam mongo db nodejs i mangusta.Wyszukiwanie tekstu mongo z mangustą

Chciałbym użyć wyszukiwania nowego tekstu mongodb.

Próbujesz użyć wyszukiwania tekstowego na temat mangusty, takiego jak aaronheckmann, ale wciąż pojawia się błąd.

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 
var Items = new Schema({ 
    type   : { type : String , default:""}, 
    color   : { type : [String] , default:""}, 
    category_A  : { type : String , default:""}, 
    category_B  : { type : String , default:""}, 
    category_C  : { type : String , default:""}, 
}); 
var textSearch = require("mongoose-text-search"); 
Items.plugin(textSearch); 
var ItemModel = mongoose.model('Item', Items); 
Items.index({ 
    type   :"text", 
    color   :"text", 
    category_A  :"text", 
    category_B  :"text", 
    category_C  :"text" 
}, 
    { 
     name: "best_match_index", 
     weights: { 
      type: 5, 
      color: 4, 
     } 
    } 
) 
ItemModel.textSearch('D', function (err, output) { 
    if (err) 
    console.log(err); 
    else 
    console.log(output) 
}) 

Uruchamiając to uzyskać:

no text index for: db.items 

Dzięki!

+0

Jaki jest błąd, który można dostać? – jsalonen

+0

brak indeksu tekstowego dla: db.items – Liatz

Odpowiedz

12

Trzeba dodać wtyczkę do schematu przed zarejestrowanie schematu jako modelu.

AKTUALIZACJA

Podobnie, trzeba zdefiniować indeks na schemacie przed zarejestrowaniem modelu. Więc ponownie kolejność ta część swojego kodu:

var textSearch = require("mongoose-text-search"); 
Items.plugin(textSearch); 
Items.index({ 
    type   :"text", 
    color   :"text", 
    category_A  :"text", 
    category_B  :"text", 
    category_C  :"text" 
}, { 
    name: "best_match_index", 
    weights: { 
     type: 5, 
     color: 4 
    } 
}); 
var ItemModel = mongoose.model('Item', Items); 

Należy pamiętać, że trzeba także podłączyć mongoose do bazy danych za pośrednictwem mongoose.connect rozmowy, które nie widzę wszędzie, ale jestem przy założeniu, że jesteś robi to poza zakresem tego kodu. Oto pełny kod użyłem, aby potwierdzić to działa:

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 
var Items = new Schema({ 
    type   : { type : String , default:""}, 
    color   : { type : [String] , default:""}, 
    category_A  : { type : String , default:""}, 
    category_B  : { type : String , default:""}, 
    category_C  : { type : String , default:""}, 
}); 
var textSearch = require("mongoose-text-search"); 
Items.plugin(textSearch); 
Items.index({ 
    type   :"text", 
    color   :"text", 
    category_A  :"text", 
    category_B  :"text", 
    category_C  :"text" 
}, { 
    name: "best_match_index", 
    weights: { 
     type: 5, 
     color: 4, 
    } 
}); 
var ItemModel = mongoose.model('Item', Items); 

mongoose.connect('mongodb://localhost/test', function (err) { 
    ItemModel.textSearch('D', function (err, output) { 
    if (err) 
     console.log(err); 
    else 
     console.log(output); 
    mongoose.disconnect(); 
    }); 
}); 

Utworzony indeks wyszukiwania tekstu wygląda to w powłoce:

test> db.items.getIndexes() 
[ 
    { 
    "v": 1, 
    "key": { 
     "_id": 1 
    }, 
    "ns": "test.items", 
    "name": "_id_" 
    }, 
    { 
    "v": 1, 
    "key": { 
     "_fts": "text", 
     "_ftsx": 1 
    }, 
    "ns": "test.items", 
    "name": "best_match_index", 
    "weights": { 
     "category_A": 1, 
     "category_B": 1, 
     "category_C": 1, 
     "color": 4, 
     "type": 5 
    }, 
    "background": true, 
    "safe": null, 
    "default_language": "english", 
    "language_override": "language", 
    "textIndexVersion": 1 
    } 
] 
+0

świetnie, że rozwiązuje błąd previos, ale nadal dostaję błąd - brak indeksu dla: db .przedmiotów. Jak napisałem w pytaniu, zadeklarowałem indeks testu. Co jest nie tak? Dzięki! – Liatz

+0

@Liatz Należy wywołać 'indeks' w schemacie przed zarejestrowaniem go również jako model. Zobacz zaktualizowaną odpowiedź. – JohnnyHK

+0

uruchomienie powyższego kodu nadal powoduje błąd - [Błąd: brak indeksu tekstowego dla: db.items] – Liatz

2

O ile mi wiadomo, większość sterowników nie wdrożyło text poleceń/funkcji wyszukiwania, więc jedynym sposobem wywołania jest użycie funkcji runCommand.

Musisz najpierw włączyć to w swojej bazie danych (i oczywiście utwórz indeks tekstowy).

http://docs.mongodb.org/manual/tutorial/enable-text-search/

lub wykonawcze

db.adminCommand({ setParameter : 1, textSearchEnabled : true }) 
+0

Moje pytanie brzmi: jeśli jedynym sposobem jest runCommand, w jaki sposób mogę użyć runCommand w mangurze? wygląda jak mangusta, nie obsługuje go, wypróbowany executeDbCommand i nie działa. – Liatz

Powiązane problemy