我目前在MongoDB中遇到了全文搜索功能的一些问题。特别是在尝试匹配精确短语时。
我正在测试mongo shell中的功能,但最终我将使用Spring Data MongoDB和Java。
所以我首先尝试运行此命令来搜索单词" delay"," late"和短语"准时"
db.mycollection.find( { $text: { $search: "delay late \"on time\"" } }).explain(true);
结果解释查询告诉我:
"parsedTextQuery" : {
"terms" : [
"delay",
"late",
"time"
],
"negatedTerms" : [ ],
"phrases" : [
"on time"
],
"negatedPhrases" : [ ] },
这里的问题是我不想搜索单词" time",而是短语" on time"。我确实想要寻找延迟和迟到,理想情况下不想阻止干扰。
我尝试了一些不同的排列,例如
db.mycollection.find( { $text: { $search: "delay late \"'on time'\"" } }).explain(true);
db.mycollection.find( { $text: { $search: "delay late \"on\" \"time\"" } }).explain(true);
但似乎无法取得正确的结果。我无法在文档中看到有关此内容的任何明显内容。
出于我的目的,我应该使用单词的全文搜索和短语的正则表达式搜索功能吗?
目前正在使用MongoDB 2.6.5版。感谢。
答案 0 :(得分:2)
您是否尝试过文本搜索以查看其行为是否正常?它在MongoDB 2.6.7上按预期工作:
> db.test.drop()
> db.test.insert({ "t" : "I'm on time, not late or delayed" })
> db.test.insert({ "t" : "I'm either late or delayed" })
> db.test.insert({ "t" : "Time flies like a banana" })
> db.test.ensureIndex({ "t" : "text" })
> db.test.find({ "$text" : { "$search" : "time late delay" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }
{ "t" : "Time flies like a banana" }
{ "t" : "I'm either late or delayed" }
> db.test.find({ "$text" : { "$search" : "late delay" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }
{ "t" : "I'm either late or delayed" }
> db.test.find({ "$text" : { "$search" : "late delay \"on time\"" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }
为什么解释中的terms
数组中的“时间”?因为如果短语"on time"
出现在文档中,则术语time
也必须如此。 MongoDB使用文本索引来帮助定位短语,然后检查索引结果以查看哪个实际匹配完整短语而不仅仅是短语中的术语。