【发布时间】:2014-07-26 07:29:45
【问题描述】:
我试过这样做
db.users.ensureIndex({"books.title":"text", "location":"2d"})
并且 MongoDB 拒绝创建索引并出现此错误
{
"ok" : 0,
"errmsg" : "bad index key pattern { books.title: \"text\", location: \"2d\" }: Can't use more than one index plugin for a single index.",
"code" : 67
}
复合索引中文本索引不能与二维索引一起使用吗?
如果是这样,处理基于第一个 books.title 字段然后是 location 字段的查询的可能解决方法是什么?
谢谢
更新:
文本索引是必要的,因为我计划在不久的将来使用加权 (http://docs.mongodb.org/manual/tutorial/control-results-of-text-search/),其中 books.title 可能会变为 books.title、books.about 和 books.keywords
关于查询,会是这样的
db.users.find({"books.title": "eragon", location: { $near :[ 150 , 23 ]}})
这意味着,找到位置在我附近且拥有名为“eragon”的书的用户
【问题讨论】:
-
mongodb 2.6 现在支持index intersection,您可以在
books.title和location上创建一个索引,尽管我不确定它是否会有相同的限制。查询计划可能会简单地忽略第二个索引,而不是产生错误。我建议对其进行测试并运行.explain()进行分析。 -
@zamnuts 索引交集不适用于文本和地理类型索引。仅支持基本 Btree 索引。但真的对于张贴者来说,你为什么还需要一个“文本”索引呢?你可能在这里混淆了这个术语。在这种情况下,一个正则表达式查询就不能做吗?
-
@NeilLunn 啊,你是对的,我对此不好。我应该先对其进行测试,而不是事后确认。
-
@YudhoAhmadDiponegoro 使用
text索引,您的查询将类似于{$text:{$search:'eragon'},location:{$near:[150,23]}}。使用文本索引时,您无需指定特定字段,因为索引中的所有内容都已合并。 -
@YudhoAhmadDiponegoro 这绝对正确。我不确定哪个索引优先,文本或位置;索引创建顺序或某种优先级可能在起作用,但我不精通这些内部结构。在SERVER 中打开功能请求并查看他们说的内容并没有什么坏处,只需几分钟!
标签: mongodb