SolrJ 5.5.0 Query 错误或根本不编码 qf 值(查询字段)
Posted
技术标签:
【中文标题】SolrJ 5.5.0 Query 错误或根本不编码 qf 值(查询字段)【英文标题】:SolrJ 5.5.0 Query encodes the qf value (Query Fields) wrongly or not at all 【发布时间】:2016-04-05 21:06:45 【问题描述】:我遇到了一个奇怪的问题。看起来像 SolrJ API 中的一个错误:
当我尝试使用 edismax 运行搜索查询时,“qf”字段未正确编码。
我正在尝试将此用作我的“qf”值:
title^40+details_plain^20
SolrQuery.set() 方法将其添加到查询中,因为它需要进行 url 编码,所以它不起作用。
当我自己对它进行 url 编码时,它变成:
qf=title%5E40+details_plain%5E20
但是,当我在查询中设置它时,生成的最终查询会自动再次对其进行编码并使其成为:
qf=title%255E40%2Bdetails_plain%255E20
这也是错误的,查询失败说“未定义的字段文本”,因为 Solr 不知道我要搜索什么,所以它试图搜索默认的“文本”字段。
这是代码中的一个sn-p:
SolrClient solr=null;
SolrQuery query = new SolrQuery();
solr = new CloudSolrClient(zookeepers, "/" );
query.set("deftype", searchConfig.getDeftype());
//query.set("df", "details_plain"); //unless i uncomment it the query fails as qf is not correct
query.set("fl", searchConfig.getFl());
query.set("mm", searchConfig.getMm());
query.set("qf", searchConfig.getQf());
query.set("rows", searchConfig.getRows());
query.set("q", searchPhrase);
query.set("collection", searchConfig.getCollection_name());
query.set("indent", "on");
query.set("omitHeader", "true");
query.set("wt", "json");
QueryResponse response = solr.query(query);
为什么它不对原始字符串进行编码,但如果我将其作为编码字符串发送,则再次对其进行编码?
我可能忽略了一些事情,所以让我知道你们的想法。我是不是做错了什么,还是应该只获取 Solr 源代码并尝试自己解决这个问题?
【问题讨论】:
【参考方案1】:据我所知,您不应该对任何字段进行编码。编码/解码部分由 solrj 透明处理。
【讨论】:
【参考方案2】:解决了。在这里为那些可能不幸犯下与我一样愚蠢的错误的人发布解决方案。
问题出在这一行:
query.set("deftype", searchConfig.getDeftype());
参数名称应为“defType”,大写 T 而不是小 t,例如:
query.set("defType", searchConfig.getDeftype());
理想情况下,在此类服务中,参数名称应全部小写,以免在此类问题上浪费人们的时间,但事实就是如此。也许在另一个 SOLR 版本中,它们会使参数名称忽略大小写。有希望!
【讨论】:
在您的问题中,您谈论的是编码问题,答案是错误的参数。你确定这个 q/a 有意义吗?恕我直言,您应该彻底重写或删除它。以上是关于SolrJ 5.5.0 Query 错误或根本不编码 qf 值(查询字段)的主要内容,如果未能解决你的问题,请参考以下文章