MongoDB 优化问题

kong_resty 发布于 2012/07/23 14:42
阅读 1K+
收藏 1

现在我有一个百万级的文档

{username:"XXXX",text="XXXXXXXXXXXX"}

现在我需要查找 text中含有 某个关键字的文档

我的方案是用 类似mysql like 方案 但是查询效率比较低下

我在想可不可以用索引,但是又不知道该怎么去做

希望有这方面研究的兄弟帮帮忙,说下方案

 

加载中
1
hokim
hokim

like操作是任何数据库都没法优化的,不关 mongodb的事儿。

建议你新建一个库,专门用于保存这个 关键字-》记录 关系,用程序去定时维护和更新这个库。

0
少帮主
少帮主
选择mongodb后做全文检索就是个大问题,同样碰到这个问题,代价
0
kong_resty
kong_resty

引用来自“少帮主”的答案

选择mongodb后做全文检索就是个大问题,同样碰到这个问题,代价
你也碰到这个问题? 建立索引能解决吗
0
开源中国首席颈椎砖家
开源中国首席颈椎砖家
你这种做索引也不能解决,还是看看有没有其他的方法,不要like
0
kong_resty
kong_resty

引用来自“杨景晨”的答案

你这种做索引也不能解决,还是看看有没有其他的方法,不要like
兄弟 有什么好的建议没 
0
开源中国首席颈椎砖家
开源中国首席颈椎砖家

在学习mongodb时遇到查找相似字符串问题,下面是解决方法:

假如需要查找的字符串为s,则可以用db.tables.find({"name":/s/}),或者db.tables.find({"name":/^s/}) ,或者db.tables.find({"name":/s.*/}),或者db.tables.find({"name":/.s.*/})

下面就分析下这几种查询的对应结果有什么不同:

1)db.city.find({"extra_data.region":/.新.*/})

共765条记录:包含了【高新技术。高新区,虎丘。渝北区(含北部新区)】

【注:由结果可以看出所查字符前面必须有字符,相当于:db.city.find({"extra_data.region":/.新./}),也相当于db.city.find({"extra_data.region":/.新/})】
-----------------------------------------------------------------------------------------------------------
2)db.city.find({"extra_data.region":/^新/})

共592条记录:包含了【新华。新洲。新都。新城。新区】

【注:由结果可以看出,此查询必须以所查字符开始】

-----------------------------------------------------------------------------------------------------------
3)db.city.find({"extra_data.region":/新.*/})

共1357条记录:记录包含了【新华。高新技术。渝北区(含北部新区)。高新区,虎丘】

【注:由结果可以看出前面字符可以有也可以没有,相当于:db.city.find({"extra_data.region":/新/})】

-----------------------------------------------------------------------------------------------------------

最后再分析下记录的结果,由上面三种查询可以看出,前两个查询的结果和正好等于最后一种的查询结果,这与注解完全符合。

0
kong_resty
kong_resty

引用来自“杨景晨”的答案

在学习mongodb时遇到查找相似字符串问题,下面是解决方法:

假如需要查找的字符串为s,则可以用db.tables.find({"name":/s/}),或者db.tables.find({"name":/^s/}) ,或者db.tables.find({"name":/s.*/}),或者db.tables.find({"name":/.s.*/})

下面就分析下这几种查询的对应结果有什么不同:

1)db.city.find({"extra_data.region":/.新.*/})

共765条记录:包含了【高新技术。高新区,虎丘。渝北区(含北部新区)】

【注:由结果可以看出所查字符前面必须有字符,相当于:db.city.find({"extra_data.region":/.新./}),也相当于db.city.find({"extra_data.region":/.新/})】
-----------------------------------------------------------------------------------------------------------
2)db.city.find({"extra_data.region":/^新/})

共592条记录:包含了【新华。新洲。新都。新城。新区】

【注:由结果可以看出,此查询必须以所查字符开始】

-----------------------------------------------------------------------------------------------------------
3)db.city.find({"extra_data.region":/新.*/})

共1357条记录:记录包含了【新华。高新技术。渝北区(含北部新区)。高新区,虎丘】

【注:由结果可以看出前面字符可以有也可以没有,相当于:db.city.find({"extra_data.region":/新/})】

-----------------------------------------------------------------------------------------------------------

最后再分析下记录的结果,由上面三种查询可以看出,前两个查询的结果和正好等于最后一种的查询结果,这与注解完全符合。

你的意思是用正则吗?
0
kong_resty
kong_resty

找一个中文分词库,然后把分词存到类似 tags 的数据中

这个思路应该没错吧

中文分词 我选择用 IK Analyzer

0
少帮主
少帮主

引用来自“章彦儿”的答案

引用来自“少帮主”的答案

选择mongodb后做全文检索就是个大问题,同样碰到这个问题,代价
你也碰到这个问题? 建立索引能解决吗

做还是可以做的,但不像sql那样直接

Apache Solr可以配合mongodb做,google下吧

 

试图用like类似的方案数据量大了完全不可行的

返回顶部
顶部