设为首页 收藏本站
查看: 1757|回复: 0

[经验分享] 论mongo-connector如何将MongoDB中的json数组和嵌套对象更新至Solr引擎

[复制链接]

尚未签到

发表于 2015-11-11 07:53:20 | 显示全部楼层 |阅读模式
  有一些东西记录下来,不久之后就会再次用到。

1. 使复杂的嵌套对象从MongoDB更新到Solr



最近使用mongo-connector将MongoDB与Solr打通,对于简单的json,更新是没问题了。这次我们遇到的问题是,如果json中某一个field的值是数组类型,或者有嵌套了一个对象,那该怎么整。比如,我们在MongoDB中插入这么个货:

{
"_id": "555df36ec6cd08ea807a4324",
"name": "小米手机",
"comments": [
{
"text": "手机是正品",
},
{
"text": "物流真他妈快",
}
]
}

这东西能同步到Solr吗,我手心真是一把汗一把汗啊。经过多次尝试,非常不幸,轰轰烈烈的失败了。

无奈,去我们伟大的官方说明看一看吧,https://github.com/10gen-labs/mongo-connector/wiki/Usage%20with%20Solr ,其中有一段:Key Names and Document Flattening,尼玛前几天还没有这段说明好不,真是坑爹啊。算了,不管怎样,看起来这东西针对上面那种json还是有办法的,按照说明,上面那段json应该转换成以下形式:

{
"_id": "555df36ec6cd08ea807a4324",
"name": "小米手机",
"comments.0.text":"手机是正品",
"comments.1.text":"物流真他妈快"
}

然后提交给Solr。并且,我们从官方文档中看不出来任何需要配置的地方,难道,默认安装好,这些东西就能行?Oh,No~~~~

这是为什么呢,我们看看官方对schema.xml的说明,原来关键点在这,大概意思就是mongo-connector会读取这个配置文件,在将数据提交给Solr之前,会将数据中没有在schema.xml中声明的field去掉。

哦,原来如此,应该是形如"comments.0.text"这样的field没有被schemal.xml声明,所以被去掉了,在Solr中见不到。那么我们对症下药,既然没有声明这个域,我们声明不就好了,在schema.xml中加入:

<field name=&quot;comments.0.text&quot; type=&quot;text_mmseg4j_complex&quot; indexed=&quot;true&quot; stored=&quot;true&quot;/>

schema.xml的路径参考上一篇文章。重启Solr,保持mongo-connector开启,重新往MongoDB中插入上面那段json,哇,ok,我们可以在Solr前端看到&quot;comments.0.text&quot;了,伟大的革命征程终于迈出了第一步!

成功之后,你可能还想显示&quot;comments.1.text&quot;,如法炮制。那么,问题来了,如果我数组中有多个对象,无限多,难道我要把所有的可能field都声明一遍?

这个问题问的真是极好的!我们不得不说schema.xml是个非常重要的东西!

这个时候,我们要用到在schemal.xml中的另外一种东西,dynamicField。这东西看起来可以通配多个名称,按照已有的示例。那么,按照我们的需求,我们这样添加:

<dynamicField name=&quot;comments*&quot; type=&quot;text_mmseg4j_complex&quot; indexed=&quot;true&quot; stored=&quot;true&quot;/>

这个意思很明显了,就是声明了所有通配comments*的域,这样我们就可以把所有的comments*一网打尽了。

如果想进一步探究mongo-connector怎样做到上面这些的,可以参考python文件:

/usr/local/lib/python2.7/dist-packages/mongo_connector/doc_managers/solr_doc_manager.py

到这,我们就完成了更新这一伟大使命。



2. 在Solr中对嵌套对象及数组进行Query



按照1中所述,我们目前可以在Solr前端看到更新的字段,并且,这些字段已经被Solr建立索引,那么我们该如何查询他们呢,比如我们想用关键字“正品”在所有的形如&quot;comments.*.text&quot;的字段中命中到“手机是正品”这个&#20540;。令人遗憾的是,Solr提供给我们&#20540;的各种查询手段,却不给我们指定目标field的各种手段,我们只是形如&quot;comments.*.text&quot;,但事实上,我们并不能在Solr中这样指定要搜索的域。

这时,不得不再次说一句,schema.xml真特么太重要了,我们用到了里面又一个东西copyField。这个东西可以看看schema.xml中的注释,大概意思就是建立索引时source的&#20540;可以加入到dest,反过来查询dest也就同时能对source进行查询,关键是多个source可以copy到一个dest啊,这不就正合我意嘛。说了这么多,只需要我们在schema.xml中加入一句:

<copyField source=&quot;comments*&quot; dest=&quot;text&quot;/>

这个dest的field &quot;text&quot;一定要设置成multiValue=&quot;true&quot;哦,不然mongo-connector会报错的,想来应该也是吧,这么多source到一个dest,别问我是怎么知道的,这个确实是我试出来的,中间过程就不多说了。

按照上面所说,这个时候我们对text域进行查找,就会去coments*域查找,设置Solr的df为text,q为关键字,猛击吧,骚年,你会得到想要的东西。

好了,码了这么多,关键点就是这么多了,坑太多,小心小心呐~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137672-1-1.html 上篇帖子: mongodb数据库拷贝 下篇帖子: Mongo DB的分析和应用场景
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表