こんにちは、私は私のコレクションで人物を検索するためにマングースを使用しています。マングースのテキスト検索
/*Person model*/
{
name: {
first: String,
last: String
}
}
は、今私は、クエリを持つ人を探したい:
let regex = new RegExp(QUERY,'i');
Person.find({
$or: [
{'name.first': regex},
{'name.last': regex}
]
}).exec(function(err,persons){
console.log(persons);
});
(私はジョーを検索する場合、イベントを)私は結果を得るジョンのために私が検索した場合。 しかし、私は明らかに任意の結果を得ていないのですジョン・ドウを検索する場合。
私はジョンにQUERYを変更した場合|ドウ私は結果を得るが、それは彼らの直前に入っ/ファーストネームでジョンまたはドウを持っているいずれかの人員を返します。
次のことは、マングースのTEXTSEARCHで試してみた:
まず、インデックスにフィールドを追加します。
PersonSchema.index({
name: {
first: 'text',
last: 'text'
}
},{
name: 'Personsearch index',
weights: {
name: {
first : 10,
last: 10
}
}
});
そして、人のクエリを変更:
Person.find({
$text : {
$search : QUERY
}
},
{ score:{$meta:'textScore'} })
.sort({ score : { $meta : 'textScore' } })
.exec(function(err,persons){
console.log(persons);
});
これはうまく動作します!全体初段/姓と一致しかし、今では唯一返している人数:
- 方法はあります>ジョーは値を返しません
- ジョン戻り
を大切>これを解決するには?
アンサー外部プラグインなしが優先されますが、他の人も同様です。
これにはElasticsearchを使用する必要があります。私は、あなたが好きなら詳細なコードを提供することができます。フルネーム検索を行うには、クエリを\ "query" \ formatに置く必要があります。 –
マングースのみで部分検索を行っても機能しません。私は3日間弾力をつけることを選ぶ前に試みました。 –
あなたに感謝しますが、Elastiqはこのケースではあまりにも多すぎるようです。姓と名を1つのフィールドにマージする可能性がある場合(1つのクエリのみ)、正規表現で検索してください。しかし、私はマングースがそれをすることができるかどうか分からないのですか? – Carsten