我收集了 200 万份文档,其中包含 20 个字段。有几个字段有 "-" 和 "。"然后是一个唯一的文件名字段。
Update
我已将“-”转换为“_”,问题仍然存在。看来“.”造成了大部分问题。我认为索引器在点上分开,因此文件名被索引,扩展名被索引,但不是整个文件名+扩展名。
更新结束
这是我拥有的文件样本。 (注意:如果您使用此示例进行测试,它将快速返回,但在 200 万个文档上,结果速度会发生变化)
{
"FileName" : "NA2148-958-041114.PDF",
"Customer" : "customer-958"
},
{
"FileName" : "NA2149-958-041116.PDF",
"Customer" : "customer-958"
},
{
"FileName" : "NA2149-959-041118.PDF",
"Customer" : "customer-959"
}
我在该集合上创建了以下全文搜索。
db.test.createIndex( {"$**": "text"})
如果我对完整文件名进行完整搜索,则最多需要 65 秒才能返回单个文档。
db.test.find({$text: {$search: "\"NA2148-958-041114.PDF\""}})
如果我做一个解释()
db.test.find({$text: {$search: "\"NA2148-958-041114.PDF\""}}).explain()
"parsedTextQuery" : {
"terms" : [
"041114",
"958",
"na2148",
"pdf"
],
"negatedTerms" : [],
"phrases" : [
"NA2148-958-041114.PDF"
],
"negatedPhrases" : []
}
我期望解释中的术语与短语相同,并使用该值搜索索引。
如果我执行以下搜索,它会在大约 15 秒内返回文档。
db.test.find({$text: {$search: "NA2148-958-041114.PDF"}}).explain() *** (不带 ") **)
{
"terms" : [
"041114",
"958",
"na2148",
"pdf"
],
"negatedTerms" : [],
"phrases" : [],
"negatedPhrases" : []
}
如果我执行以下搜索,它将在 1 秒内返回文档。
db.test.find({$text: {$search: "041114"}})
{
"terms" : [
"041114"
],
"negatedTerms" : [],
"phrases" : [],
"negatedPhrases" : []
}
我怀疑索引步骤正在分割值,因此整个文件名没有索引,只有块。
有没有办法让搜索仅使用该短语,并且在被“”包围时不对它进行标记,或者让索引步骤不对“-”或“.”进行标记。在文件名中?
注意:我已经读到,使用 $default_language: "none" 进行索引将使用简单的 tokenizer,但这并没有改变结果。
关于这个主题的任何帮助或指导都会很棒。
这是在“-”前面添加“\”时的结果,在explain()或速度上没有什么不同。
db.text.find({$text: {$search: "\"NA2148\-958\-041114\.PDF\""}}).explain()
{
"terms" : [
"041114",
"958",
"na2148",
"pdf"
],
"negatedTerms" : [],
"phrases" : [
"NA2148-958-041114.PDF"
],
"negatedPhrases" : []
}