Solr string类型字段精确查询无结果,请求原因分析
问题:Solr string类型字段无法精确匹配查询的原因
我将name字段设置为string类型并索引了数据,索引条目示例如下:
{ "custom_id":"234323244323242", "full_id":"ju7328732", "weblink":"https://planet.org/323232", "name":"idexlab", "type":"entry", "id":"151e0151-1036-4b97-86d1-59f8adaeb8a7", "_version_":1770751587544727552 }
通过以下命令创建该字段的schema配置:
( curl -s -X POST -H 'Content-type:application/json' --data-binary '{"add-field": {"name":"name", "type":"string", "multiValued":false, "stored":true, "indexed":true, "termVectors":true }}' "http://localhost:8984/solr/$core_name/schema" | python3 -c "import sys, json; print('***adding name:', json.load(sys.stdin)['responseHeader']['status'])" );
现在在GUI中搜索idexlab无结果,等价查询URL为:
http://localhost:8984/solr/#/final_idx/query?q=idexlab&q.op=OR&indent=true&useParams=
但将该字段改为text_general类型时,查询可正常返回结果。已知string类型适用于精确匹配场景,请问为何当前配置无法生效?
分析与解决
1. 未明确指定查询字段
Solr默认查询的是df(默认字段,通常为_text_),而非你定义的name字段。当字段类型为text_general时,该字段的值大概率通过copyField配置被复制到了_text_字段,因此无字段限定的查询能命中。但string类型字段一般不会被复制到默认文本字段,因此必须明确指定查询字段:
q=name:idexlab
2. 字段配置未对已有文档生效
如果是先索引数据,再添加name字段的string类型配置,已索引的旧文档不会自动更新字段类型。Solr的字段类型配置仅对新索引/更新的文档生效,旧文档需要重新导入或执行更新操作,才能让name字段以string类型被正确索引。
3. 大小写敏感性(可能性较低)
string类型是严格精确匹配,包括大小写。如果查询时输入的大小写与索引中的name值不一致(比如IdexLab),会导致无法命中。但你的示例中大小写一致,此情况可排除。
内容的提问来源于stack exchange,提问作者JohnJ
相关产品推荐
相关产品推荐

