我使用nodeJs Mongoose来执行文本搜索;
var mongoose = require('mongoose');
var config = require('../config');
var mongoosePaginate = require('mongoose-paginate');
var poiSchema = mongoose.Schema({
city:String,
cap:String,
country:String,
address: String,
description: String,
latitude: Number,
longitude: Number,
title: String,
url: String,
images:Array,
freeText:String,
owner:String,
});
poiSchema.index({'$**': 'text'});
poiSchema.plugin(mongoosePaginate);
mongoose.Promise = global.Promise;
mongoose.connect(config.database);
module.exports = mongoose.model('Poi', poiSchema);
正如你在这里看到的那样
poiSchema.index({'$**': 'text'});
我在架构中的每个字段上创建一个文本索引。
当我尝试执行文本搜索时,我开发了这段代码:
var term = "a search term";
var query = {'$text':{'$search': term}};
Poi.paginate(query, {}, function(err, pois) {
if(!pois){
pois = {
docs:[],
total:0
};
}
res.json({search:pois.docs,total:pois.total});
});
不幸的是,当我在术语搜索中使用空格时,它将获取集合中的所有文档,这些文档匹配由空格分割的术语搜索中的每个字段。
我认为文本索引具有标记化空格;
我需要知道如何转义空格,以便搜索具有整个术语搜索的每个字段而不分割它。
我尝试用\\
替换空格,但没有任何变化。
可以请别人帮帮我吗?
答案 0 :(得分:3)
MongoDB允许对字符串内容进行文本搜索查询,支持不区分大小写,分隔符,停用词和词干。默认情况下,搜索字符串中的术语是“或”。从文档中,$search
字符串是......
MongoDB解析并用于查询文本索引的一串术语。 MongoDB执行术语的逻辑OR搜索,除非指定为短语。
因此,如果$search
字符串中至少有一个术语匹配,则MongoDB返回该文档,MongoDB使用所有术语进行搜索(其中术语是由空格分隔的字符串)。 / p>
您可以通过指定短语来更改此行为,您可以通过在引号中包含多个术语来执行此操作。在您的问题中,我想您要搜索确切的短语:a search term
所以只需将该短语括在转义字符串引号中。
以下是一些例子:
鉴于这些文件:
{ "_id" : ..., "name" : "search" }
{ "_id" : ..., "name" : "term" }
{ "_id" : ..., "name" : "a search term" }
以下查询将返回...
// returns the third document because that is the only
// document which contains the phrase: 'a search term'
db.collection.find({ $text: { $search: "\"a search term\"" } })
// returns all three documents because each document contains
// at least one of the 3 terms in this search string
db.collection.find({ $text: { $search: "a search term" } })
因此,总而言之,您通过将您的搜索字词集合包含在转义字符串引号中而不是"a search term"
使用"\"a search term\""
来“逃避空白”。