如何用SolrJ Client构建指定JSON格式的Solr查询?
问题
我能通过Postman访问本地Solr,但没法用SolrJ Client构建以下指定的JSON查询:
{ "query": { "bool": { "should": [ { "edismax": { "query": "\"market value\"", "qf": "title^10", "tie": "0.1", "mm": "100%" } }, { "edismax": { "query": "market+value", "qf": "title^2", "tie": "0.1", "mm": "100%" } }, { "edismax": { "query": "(market* AND value*)", "qf": "title^5", "tie": "0.1", "mm": "100%" } }, { "edismax": { "query": "(market~ AND value~)", "qf": "title^1", "tie": "0.1", "mm": "100%" } }, { "edismax": { "query": "{!knn f=title_vector topK=100}[-0.019111417, -0.025036218, 0.0041847187, -0.013134183]" } } ] } } }
我曾尝试过这种写法,但没成功:
query {!bool should=$ref1 should=$ref2 should=$ref3}&ref1=title:"Market Value"&ref2=title:Market+Value&ref3=(title:Market* AND title:Value*)
解决方案
用SolrJ构建这个Bool查询,需要分别创建每个EDisMax子查询,再把它们加入到BoolQuery的should子句中,同时处理KNN查询的特殊语法。以下是具体实现代码:
import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.common.params.DisMaxParams; public class SolrJQueryBuilder { public static void main(String[] args) throws Exception { // 初始化Solr客户端 String solrUrl = "http://localhost:8983/solr/your_core_name"; SolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); // 创建BoolQuery作为主查询 SolrQuery mainQuery = new SolrQuery(); mainQuery.setQuery("{!bool}"); // 1. 第一个EDisMax查询:精确短语匹配 SolrQuery disMax1 = new SolrQuery(); disMax1.set("q", "\"market value\""); disMax1.set(DisMaxParams.QF, "title^10"); disMax1.set(DisMaxParams.TIE, "0.1"); disMax1.set(DisMaxParams.MM, "100%"); mainQuery.add("should", "{!edismax " + disMax1.toQueryString() + "}"); // 2. 第二个EDisMax查询:分词匹配 SolrQuery disMax2 = new SolrQuery(); disMax2.set("q", "market value"); disMax2.set(DisMaxParams.QF, "title^2"); disMax2.set(DisMaxParams.TIE, "0.1"); disMax2.set(DisMaxParams.MM, "100%"); mainQuery.add("should", "{!edismax " + disMax2.toQueryString() + "}"); // 3. 第三个EDisMax查询:前缀匹配 SolrQuery disMax3 = new SolrQuery(); disMax3.set("q", "(market* AND value*)"); disMax3.set(DisMaxParams.QF, "title^5"); disMax3.set(DisMaxParams.TIE, "0.1"); disMax3.set(DisMaxParams.MM, "100%"); mainQuery.add("should", "{!edismax " + disMax3.toQueryString() + "}"); // 4. 第四个EDisMax查询:模糊匹配 SolrQuery disMax4 = new SolrQuery(); disMax4.set("q", "(market~ AND value~)"); disMax4.set(DisMaxParams.QF, "title^1"); disMax4.set(DisMaxParams.TIE, "0.1"); disMax4.set(DisMaxParams.MM, "100%"); mainQuery.add("should", "{!edismax " + disMax4.toQueryString() + "}"); // 5. KNN向量查询 String knnQuery = "{!knn f=title_vector topK=100}[-0.019111417, -0.025036218, 0.0041847187, -0.013134183]"; mainQuery.add("should", knnQuery); // 执行查询(按需开启) // QueryResponse response = solrClient.query(mainQuery); // 处理查询结果... solrClient.close(); } }
关键说明:
- 每个EDisMax子查询通过
SolrQuery配置参数后,拼接成{!edismax ...}的形式加入Bool查询的should列表 - KNN查询直接使用原始语法字符串加入
should子句 - 注意替换代码中的
your_core_name为实际Solr Core名称
内容的提问来源于stack exchange,提问作者Gaurav Sharma
相关产品推荐
相关产品推荐

