我正在尝试在Mongo数据库中实现全文搜索。它是音轨元数据的数据库。我不想通过artistName
的{{1}}和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'})
我不小心注意到,当我从搜索到的单词的末尾剪下一些字母时,我开始得到一些结果......所以全文搜索在某种程度上起作用,只是没有我希望和期望的方式。 / p>
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Tapani'}}).size()
0
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkautemme valssi'}}).size()
0
有人可以告诉我,如何使用完整的单词搜索数据库,或者我做错了什么?
我在MongoDB版本3.0.8和3.2.1
上尝试过答案 0 :(得分:1)
根据规范 -
对于不区分大小写和变音符号不敏感的文本搜索, $ text运算符匹配完整的词干。所以,如果一个文件 字段包含蓝莓这个词,对蓝色一词的搜索不会 比赛。但是,蓝莓或蓝莓会匹配。
我建议的是正常索引和正则表达式搜索
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上测试没有运气:(
答案 1 :(得分:1)
所以,问题在于存储在数据库中的文档。我没有注意到它们包含一个名为function HideColumn() {
var el = document.getElementById('columntarget');
el.className += 'hideColumn';
}
的字段,它会更改全文搜索行为,尽管我尝试通过在索引和查询中设置.hideColumn > div {
width: 0px;
overflow: hidden;
transition: all 2s step-end;
}
td, div {
width: 50px;
padding: 0px;
}
.hideColumn {
width: 0px;
transition: all 2s step-end;
}
table {
border-collapse: collapse;
table-layout: fixed;
}
来禁用词干。
当我将<table style="width:500px;" border=1>
<tr>
<td>
<div style='background-color:red;'>column 1</div>
</td>
<td style='width:auto'>
<div style='background-color:blue;'>column 3</div>
</td>
<td id="columntarget">
<div style='background-color:yellow;'>column 2</div>
</td>
</tr>
</table>
<button onclick='HideColumn()'>Hide
</button>
字段重命名为其他名称时,全文搜索开始完全符合我的预期。