You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:47:29