Solr文本字段分面查询无返回结果问题求助
Solr 8/9分面无结果问题排查与解决
问题现象
尝试用分面功能查看字段中已索引的词条(作为调试工具),但未获取到任何分面词条。文档已正常索引(空查询能查到目标文档,搜索test词条也能匹配到结果),但旧版分面API和新版JSON分面API均返回空结果。
复现脚本
#!/bin/bash COLLECTION=test NUM_SHARDS=1 # Solr v9 (maybe earlier) doesn't restrict to single shard, BUT doesn't matter for our small dataset TERMS=test TYPE=text_general SUFFIX=_t FIELD=test$SUFFIX DOC_ID=doc1 echo;echo echo Removing Any Previous collection - will give error if run for the first time curl "http://localhost:8983/solr/admin/collections?action=DELETE&name=$COLLECTION" echo;echo echo Creating Collection $COLLECTION with $NUM_SHARDS shards curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=$COLLECTION&numShards=$NUM_SHARDS&replicationFactor=1&maxShardsPerNode=$NUM_SHARDS" echo;echo echo Adding doc id = $DOC_ID with TERMS = $TERMS curl -X POST "http://localhost:8983/solr/$COLLECTION/update?commit=true" \ -H "Content-Type: application/json" \ -d "[ { \"id\": \"$DOC_ID\", \"$FIELD\": \"this is a test of the Solr indexing system: TERMS = $TERMS\" } ]" echo;echo echo Query for all docs curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*" echo;echo echo Query for TERMS = $TERMS curl "http://localhost:8983/solr/$COLLECTION/select?defType=edismax&qf=$FIELD&q=$TERMS&rows=1" echo;echo echo Testing Old Facet API curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*&rows=0&facet=true&facet.field=$FIELD" echo;echo echo Testing New Facet API curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*&rows=0&json.facet=%7Bwords:%7Btype:terms,field:content_t,limit:10%7D%7D" echo;echo echo Done
旧版分面API返回结果示例
{ "responseHeader":{ "zkConnected":true, "status":0, "QTime":0, "params":{ "q":"*:*", "facet.field":"test_t", "rows":"0", "facet":"true" } }, "response":{ "numFound":1, "start":0, "numFoundExact":true, "docs":[ ] }, "facet_counts":{ "facet_queries":{ }, "facet_fields":{ "test_t":[ ] }, "facet_ranges":{ }, "facet_intervals":{ }, "facet_heatmaps":{ } } }
问题原因
- 分词字段未启用DocValues:
text_general属于分词字段,Solr分面统计依赖DocValues高效获取词条计数。默认情况下text类型字段未开启docValues="true",导致分面无法读取索引中的词条数据。 - 新版JSON分面API字段名错误:脚本中新版分面请求指定的字段是
content_t,但实际插入的字段是test_t,字段不匹配导致无结果。
解决方案
1. 为text类型字段启用DocValues
创建集合后,先为test_t字段添加DocValues支持:
curl -X POST "http://localhost:8983/solr/$COLLECTION/schema" -H "Content-Type: application/json" -d '{ "add-field": { "name": "test_t", "type": "text_general", "docValues": true, "stored": true } }'
也可以直接在Solr Admin界面的Schema页面修改字段配置,开启DocValues。
2. 修正新版JSON分面API的字段名
将新版分面请求中的field:content_t改为field:test_t,修正后的请求:
curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*&rows=0&json.facet=%7Bwords:%7Btype:terms,field:test_t,limit:10%7D%7D"
3. 完整修正后的脚本
#!/bin/bash COLLECTION=test NUM_SHARDS=1 TERMS=test TYPE=text_general SUFFIX=_t FIELD=test$SUFFIX DOC_ID=doc1 echo;echo echo Removing Any Previous collection - will give error if run for the first time curl "http://localhost:8983/solr/admin/collections?action=DELETE&name=$COLLECTION" echo;echo echo Creating Collection $COLLECTION with $NUM_SHARDS shards curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=$COLLECTION&numShards=$NUM_SHARDS&replicationFactor=1&maxShardsPerNode=$NUM_SHARDS" echo;echo echo Configuring field $FIELD with DocValues enabled curl -X POST "http://localhost:8983/solr/$COLLECTION/schema" -H "Content-Type: application/json" -d '{ "add-field": { "name": "'$FIELD'", "type": "'$TYPE'", "docValues": true, "stored": true } }' echo;echo echo Adding doc id = $DOC_ID with TERMS = $TERMS curl -X POST "http://localhost:8983/solr/$COLLECTION/update?commit=true" \ -H "Content-Type: application/json" \ -d "[ { \"id\": \"$DOC_ID\", \"$FIELD\": \"this is a test of the Solr indexing system: TERMS = $TERMS\" } ]" echo;echo echo Query for all docs curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*" echo;echo echo Query for TERMS = $TERMS curl "http://localhost:8983/solr/$COLLECTION/select?defType=edismax&qf=$FIELD&q=$TERMS&rows=1" echo;echo echo Testing Old Facet API curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*&rows=0&facet=true&facet.field=$FIELD" echo;echo echo Testing New Facet API curl "http://localhost:8983/solr/$COLLECTION/select?q=*:*&rows=0&json.facet=%7Bwords:%7Btype:terms,field:'$FIELD',limit:10%7D%7D" echo;echo echo Done
验证结果
运行修正后的脚本后,分面API会返回分词后的词条及计数,示例如下:
"facet_counts":{ "facet_queries":{ }, "facet_fields":{ "test_t":[ "test",2, "is",1, "this",1, "of",1, "indexing",1, "system",1, "terms",1 ] }, ... }
内容的提问来源于stack exchange,提问作者Mark Bennett
相关产品推荐
相关产品推荐

