Solr 6:关联文档返回双方字段及用户位置批量更新优化咨询
嘿,针对你遇到的这两个Solr使用问题,我结合Solr 6的特性给你整理了实用的解决方案,应该能帮你解决效率和关联查询的问题:
一、批量更新user_id下大量文档的效率优化
当user_id下文档超过500时,逐个更新的效率问题确实会凸显,试试这些优化手段:
- 用UpdateByQuery(UBQ)做批量更新:这是最直接的解决办法!我之前处理过类似场景,用UBQ比逐个更新快了N倍——它不需要你先把所有文档拉到客户端再更新,直接在Solr服务器端根据查询条件完成批量修改。比如要更新user_id=9的所有文档的位置字段,直接发这个请求就行:
注意别每次更新都立刻commit!频繁提交会严重拖慢速度,可以把autoCommit的触发阈值调大(比如curl -X POST -H "Content-Type: application/json" http://your-solr-instance/core/update -d '{ "update": { "query": "user_id:9", "set": { "location": "new_latitude,new_longitude" } } }'autoCommit.maxDocs=10000或autoCommit.maxTime=30000),等所有更新完成后再手动提交一次。 - 强制使用原子更新:如果只是更新位置这类单个字段,绝对不要全量替换文档!原子更新让Solr只修改目标字段,不需要重新索引整个文档,资源开销小很多。上面UBQ例子里的
set操作就是原子更新的一种,如果你需要基于原字段值计算新值,还可以用inc、add等操作。 - 批量提交更新请求:如果因为业务逻辑必须先拉取文档再修改(比如要基于原位置做计算),那也别一条一条发请求,把多个更新文档打包成一个JSON数组一次性提交,减少HTTP请求的往返开销:
curl -X POST -H "Content-Type: application/json" http://your-solr-instance/core/update -d '[ {"id":"11", "user_id":9, "location":{"set":"new_lat1,new_lon1"}}, {"id":"12", "user_id":9, "location":{"set":"new_lat2,new_lon2"}}, ... ]'
二、Solr 6中关联文档返回双方字段
Solr 6提供了几种靠谱的方式来实现关联文档的字段返回,根据你的关联场景选就行:
- Join查询(最适合同级关联):如果两个文档通过某个字段关联(比如互相存对方的id在
related_id字段),用Join查询可以一次性拉取双方的字段。比如你要搜索title包含关键词的文档,同时返回它关联文档的title和description,可以这么写查询参数:
这里用q=title:你的关键词 &fl=id,title,description,{!join from=related_id to=id}title:related_title,{!join from=id to=related_id}description:related_descriptionfl参数指定了要返回当前文档的字段,还通过join语法把关联文档的字段别名后一起返回,注意关联字段要确保是索引过的(最好是string或integer类型)。 - Parent/Child文档关系(适合层级关联):如果你的文档可以建模成父子层级(比如把user作为父文档,其下的所有post作为子文档),可以用Block Join查询来获取双方字段。首先要确保schema里有
_root_字段(Solr 6默认支持),索引子文档时把_root_设为父文档的id。查询时用:
这种方式适合有明确上下层级的关联,要是你的文档是同级关联,还是用Join更合适。q={!parent which="doc_type:user"}title:你的关键词 &fl=id,username,[child parentFilter="doc_type:user" fl="id,title,description"] - Expand组件(适合展开关联文档):如果需要把主文档和关联文档分开展示,用Expand组件很方便。查询参数可以这么写:
查询结果里会包含主文档的字段,还有一个q=title:你的关键词 &expand=true &expand.q=related_id:$id &expand.fl=id,title,descriptionexpand节点专门放关联文档的所有字段,前端处理起来也清晰。
内容的提问来源于stack exchange,提问作者MTA
相关产品推荐
相关产品推荐

