Mongo 全文搜索未找到
Mongo full text search doesn't find
我正在尝试在我的 Mongo 数据库中实现全文搜索。它是音轨元数据的数据库。我不想按 artistName
和 title
搜索 track
。我在 tracks
集合中有这些记录(仅显示重要字段):
db.tracks.find({},{artistName: 1, title: 1})
{ "_id" : "A10328E00047516670", "artistName" : "Tapani Kansa", "title" : "Tuulia" }
{ "_id" : "A10328E00047516661", "artistName" : "Tapani Kansa", "title" : "Rakkautemme valssi" }
{ "_id" : "A10328E0004751669W", "artistName" : "Tapani Kansa", "title" : "Täysikuu" }
{ "_id" : "A10328E0004751668Y", "artistName" : "Tapani Kansa", "title" : "Muista minua" }
我已经为这个集合创建了文本索引:
db.tracks.createIndex({artistName: 'text', title: 'text', lyrics: 'text'})
但是当我尝试搜索曲目时,没有返回任何结果:
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Tapani'}}).size()
0
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkautemme valssi'}}).size()
0
我无意中注意到,当我从搜索词的末尾裁剪一些字母时,我开始得到一些结果...所以全文搜索以某种方式起作用,只是不是我希望和期望的方式.
db.tracks.find({$text: {$search: 'Tapa'}}).size()
12
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkaute'}}).size()
1
谁能告诉我,我怎样才能使用全词搜索数据库,或者我做错了什么?
我已经在 MongoDB 版本 3.0.8 和 3.2.1
上试过了
根据规范 -
For case insensitive and diacritic insensitive text searches, the
$text operator matches on the complete stemmed word. So if a document
field contains the word blueberry, a search on the term blue will not
match. However, blueberry or blueberries will match.
我建议的是普通索引和正则表达式搜索
db.tracks.createIndex({"artistName": 1})
db.tracks.createIndex({ "title" : 1})
db.tracks.createIndex({ "lyrics": 1})
db.tracks.find({artistName:"/Tap/[0-10]"}).explain()
方括号将强制对正则表达式进行索引扫描而不是 colscan
正在 3.0.6 和 3.2.3 上测试,但没有成功:(
所以,问题出在数据库中存储的文档中。我没有注意到它们包含一个名为 language
的字段,它改变了全文搜索行为,尽管我试图通过在索引和查询中设置 language: 'none'
来禁用词干提取。
当我将 language
字段重命名为其他名称时,全文搜索开始正常工作。
我正在尝试在我的 Mongo 数据库中实现全文搜索。它是音轨元数据的数据库。我不想按 artistName
和 title
搜索 track
。我在 tracks
集合中有这些记录(仅显示重要字段):
db.tracks.find({},{artistName: 1, title: 1})
{ "_id" : "A10328E00047516670", "artistName" : "Tapani Kansa", "title" : "Tuulia" }
{ "_id" : "A10328E00047516661", "artistName" : "Tapani Kansa", "title" : "Rakkautemme valssi" }
{ "_id" : "A10328E0004751669W", "artistName" : "Tapani Kansa", "title" : "Täysikuu" }
{ "_id" : "A10328E0004751668Y", "artistName" : "Tapani Kansa", "title" : "Muista minua" }
我已经为这个集合创建了文本索引:
db.tracks.createIndex({artistName: 'text', title: 'text', lyrics: 'text'})
但是当我尝试搜索曲目时,没有返回任何结果:
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Tapani'}}).size()
0
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkautemme valssi'}}).size()
0
我无意中注意到,当我从搜索词的末尾裁剪一些字母时,我开始得到一些结果...所以全文搜索以某种方式起作用,只是不是我希望和期望的方式.
db.tracks.find({$text: {$search: 'Tapa'}}).size()
12
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkaute'}}).size()
1
谁能告诉我,我怎样才能使用全词搜索数据库,或者我做错了什么?
我已经在 MongoDB 版本 3.0.8 和 3.2.1
上试过了根据规范 -
For case insensitive and diacritic insensitive text searches, the $text operator matches on the complete stemmed word. So if a document field contains the word blueberry, a search on the term blue will not match. However, blueberry or blueberries will match.
我建议的是普通索引和正则表达式搜索
db.tracks.createIndex({"artistName": 1})
db.tracks.createIndex({ "title" : 1})
db.tracks.createIndex({ "lyrics": 1})
db.tracks.find({artistName:"/Tap/[0-10]"}).explain()
方括号将强制对正则表达式进行索引扫描而不是 colscan
正在 3.0.6 和 3.2.3 上测试,但没有成功:(
所以,问题出在数据库中存储的文档中。我没有注意到它们包含一个名为 language
的字段,它改变了全文搜索行为,尽管我试图通过在索引和查询中设置 language: 'none'
来禁用词干提取。
当我将 language
字段重命名为其他名称时,全文搜索开始正常工作。