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 值(查询字段)的主要内容,如果未能解决你的问题,请参考以下文章

如何在solrj中创建新核心

solrJ 查询参数

有 SolrJ 查询生成器吗?

solrj操作solr索引库(流程)

如何使用SOLRJ java客户端从SOLR获取列名(字段)?

使用EmbeddedSolrServer中的solrj为包含内容的文档编制索引