solr_代码中使用solr二(查询)

本文介绍了如何在代码中使用Solr进行各种查询操作,包括单条件查询、分页查询、AND条件查询、OR条件查询、混合条件查询以及facet分组和group分组。示例代码详细展示了如何构建查询语句、处理查询结果,并通过排序和分组实现复杂的数据筛选和统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1) 单条件查询

 String queryStr = "user_uuid:*";

SolrQuery query = new SolrQuery(queryStr);

SolrDocumentList solrDocumentList = solrDao.getResults(query);

 

public SolrDocumentList getResults(SolrQuery query) {

    QueryResponse response = null;

    try {

        response = httpSolrClient.query(query);

        if (response == null) {

            return null;

        }

    } catch (SolrServerException | IOException e) {

       e.printStackTrace();

    }

 

    return response.getResults();

}

 

{numFound=4,start=0,docs=[

SolrDocument{id=001, user_uuid=001, user_name=张三, user_age=23, user_birthday=1988-10-24 12:40:21, user_city=北京, _version_=1558767452121202688},

SolrDocument{user_name=李四, user_age=24, id=002, user_city=北京, user_birthday=1988-10-24 11:40:21, user_uuid=002, _version_=1558768367416901632},

SolrDocument{id=003, user_uuid=003, user_name=王五, user_age=25, user_birthday=1988-10-24 10:40:21, user_city=北京, _version_=1558826141613031424},

SolrDocument{user_name=赵六, user_age=25, id=004, user_city=上海, user_birthday=1988-10-24 10:40:21, user_uuid=004, _version_=1558826302547427328}]

}

 

2) 分页查询

 

query.setStart(20);// 从第20行开始,加10行,相当于第三页(每页10个)

query.setRows(10);

 

3) And条件查询

List<String> conditions = Lists.newArrayList();

conditions.add("user_uuid:*");

conditions.add("user_city:北京");

Joiner joiner = Joiner.on(" AND ").skipNulls();

String queryStr = joiner.join(conditions);

SolrQuery query = new SolrQuery(queryStr);

SolrDocumentList solrDocumentList = solrDao.getResults(query);

 

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=王五, age=25, id=003, city=北京, birthday=1988-10-24 10:40:21]

 

4) Or条件查询

List<String> conditions = Lists.newArrayList();

conditions.add("user_uuid:002");

conditions.add("user_city:上海");

Joiner joiner = Joiner.on(" OR ").skipNulls();

String queryStr = joiner.join(conditions);

SolrQuery query = new SolrQuery(queryStr);

SolrDocumentList solrDocumentList = solrDao.getResults(query);

 

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=赵六, age=25, id=004, city=上海, birthday=1988-10-24 10:40:21]

 

5) 混合条件查询

查询北京地址且为23岁,或者地址为上海

(user_city:北京 AND user_age:23) OR user_city:上海

List<String> conditions_and = Lists.newArrayList();

conditions_and.add("user_age:23");

conditions_and.add("user_city:北京");

Joiner joiner_and = Joiner.on(" AND ").skipNulls();

String queryStr_and = joiner_and.join(conditions_and);

queryStr_and = "(" + queryStr_and + ")";

 

List<String> conditions_or = Lists.newArrayList();

conditions_or.add("user_city:上海");

conditions_or.add(queryStr_and);

Joiner joiner_or = Joiner.on(" OR ").skipNulls();

String queryStr = joiner_or.join(conditions_or);

 

SolrQuery query = new SolrQuery(queryStr);

SolrDocumentList solrDocumentList = solrDao.getResults(query);

 

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

User [name=赵六, age=25, id=004, city=上海, birthday=1988-10-24 10:40:21]

 

6) facet分组

Facet分组只能得到分组后的count值,得不到具体是哪些元素在一个组,主要用于统计,如果要知道分完组的内容,需要使用group分组。

 

String queryStr = "*:*";

SolrQuery query = new SolrQuery(queryStr);

query.setFacet(true);// 设置使用facet

query.setFacetMissing(true);// true将统计那些Facet字段值为null的记录

query.setFacetLimit(100);// 设置分组后最大的组数

query.setFacetMinCount(1);// 分组后每组count值小于此值的将不被统计

query.addFacetField("user_city");// facet的字段

//query.setFacetPrefix("北");// 字段的前缀条件

query.setFacetSort(FacetParams.FACET_SORT_COUNT); // 设置以分组count值排序

 

QueryResponse response = solrDao.getResponse(query);

System.out.println(response.toString());

Map<String, Long> map = Maps.newLinkedHashMap();

for (FacetField facetField : response.getFacetFields()) {

for (Count count1 : facetField.getValues()) {

map.put(count1.getName(),  count1.getCount());

}

}

 

System.out.println(map.toString());

 

{responseHeader={status=0,QTime=10,params={q=*:*,facet.limit=100,facet.field=user_city,facet.missing=true,facet.mincount=1,facet=true,wt=javabin,version=2,facet.sort=count}},response={numFound=9,start=0,docs=[

SolrDocument{id=001, user_uuid=001, user_name=张三, user_age=23, user_birthday=1988-10-24 12:40:21, user_city=北京, _version_=1558767452121202688},

SolrDocument{user_name=李四, user_age=24, id=002, user_city=北京, user_birthday=1988-10-24 11:40:21, user_uuid=002, _version_=1558768367416901632},

SolrDocument{id=003, user_uuid=003, user_name=王五, user_age=25, user_birthday=1988-10-24 10:40:21, user_city=北京, _version_=1558826141613031424},

SolrDocument{user_name=赵六, user_age=25, id=004, user_city=上海, user_birthday=1988-10-24 10:40:21, user_uuid=004, _version_=1558826302547427328}, SolrDocument{id=000, name=test, _version_=1558840061425876992},

SolrDocument{id=005, user_uuid=005, user_name=张三, user_city=武汉, user_birthday=1980-01-02 05:40:21, _version_=1558841057497579520},

SolrDocument{id=006, user_uuid=006, user_age=34, user_name=张三, user_city=天津, user_birthday=1980-01-02 05:40:21, _version_=1558841102404943872},

SolrDocument{id=007, user_uuid=007, user_age=35, user_name=张三, user_city=河北, user_birthday=1980-01-02 05:40:21, _version_=1558841126665846784},

SolrDocument{id=008, user_uuid=008, user_age=35, user_name=李四, user_city=河北, user_birthday=1980-01-02 05:40:21, _version_=1558841148453158912}]},

facet_counts={facet_queries={},facet_fields={

user_city={北京=3,河北=2,上海=1,天津=1,武汉=1,null=1}},

facet_dates={},

facet_ranges={},

facet_intervals={},

facet_heatmaps={}}}

 

{北京=3, 河北=2, 上海=1, 天津=1, 武汉=1, null=1}

 

7) Group分组

使用下面的排序方法将现有的数据按city排序后输出如下:

User [name=赵六, age=30, id=010, city=河北, birthday=1988-10-24 10:40:21]

User [name=张三, age=35, id=007, city=河北, birthday=1980-01-02 05:40:21]

User [name=李四, age=35, id=008, city=河北, birthday=1980-01-02 05:40:21]

User [name=张三, age=35, id=005, city=武汉, birthday=1987-01-02 05:40:21]

User [name=张三, age=34, id=006, city=天津, birthday=1980-01-02 05:40:21]

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=赵六, age=24, id=009, city=北京, birthday=1988-10-24 10:40:21]

User [name=王五, age=25, id=003, city=北京, birthday=1988-10-24 10:40:21]

User [name=赵六, age=25, id=004, city=上海, birthday=1988-10-24 10:40:21]

 

city分组:

// group分组

public void query_group(){

    String queryStr = "user_uuid:*";

    SolrQuery query = new SolrQuery(queryStr);

    query.setParam(GroupParams.GROUP,true);  

    query.setParam(GroupParams.GROUP_FIELD,"user_city");

    query.setParam(GroupParams.GROUP_LIMIT,"10000");//每个分组返回的文档数量, 默认为1

    query.setParam(GroupParams.GROUP_FORMAT, "grouped");// 默认为 grouped所有文档分组显示 ,simple的话所有文档显示在一个集合中

    query.setParam(GroupParams.GROUP_MAIN,"false");//format为grouped的时候,必须为false

    query.setParam(GroupParams.GROUP_TOTAL_COUNT, true);//返回分组个数ngroups

    query.setStart(0);// 设置起始值,分页用的,默认为0

    query.setRows(35);// 设置返回的最大组数,默认为10,可与start配合做分页

    query.setIncludeScore(true);//是否按每组数量高低排序

    QueryResponse response = solrDao.getResponse(query);

    GroupResponse groupResponse = response.getGroupResponse();        

List<GroupCommand> groupCommands =  groupResponse.getValues();

for(GroupCommand groupCommand: groupCommands){

// 组数,设置GroupParams.GROUP_TOTAL_COUNT为true才有值

Integer groupSize = groupCommand.getNGroups();

System.out.println("groupSize: " + groupSize);

// 分组字段名,GroupParams.GROUP_FIELD,如user_city

String groupName = groupCommand.getName();

System.out.println("groupName: " + groupName);

for(Group group: groupCommand.getValues()){

// 分组名,即GroupParams.GROUP_FIELD对应的值

String groupValue = group.getGroupValue();

System.out.println("------------------"+groupValue+"---------------");

for(SolrDocument document: group.getResult()){

printUser(document);

}

}

}

}

private void printUser(SolrDocument solrDocument){

User user = new User();

user.setId((String) solrDocument.get("id"));

user.setUserId((String) solrDocument.get("user_uuid"));

user.setName((String) solrDocument.get("user_name"));

user.setAge((int) solrDocument.get("user_age"));

user.setBirthday((String) solrDocument.get("user_birthday"));

user.setCity((String) solrDocument.get("user_city"));

System.out.println(user.toString());

}

------------------北京---------------

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=王五, age=25, id=003, city=北京, birthday=1988-10-24 10:40:21]

User [name=赵六, age=24, id=009, city=北京, birthday=1988-10-24 10:40:21]

------------------上海---------------

User [name=赵六, age=25, id=004, city=上海, birthday=1988-10-24 10:40:21]

------------------天津---------------

User [name=张三, age=34, id=006, city=天津, birthday=1980-01-02 05:40:21]

------------------河北---------------

User [name=张三, age=35, id=007, city=河北, birthday=1980-01-02 05:40:21]

User [name=李四, age=35, id=008, city=河北, birthday=1980-01-02 05:40:21]

User [name=赵六, age=30, id=010, city=河北, birthday=1988-10-24 10:40:21]

------------------武汉---------------

User [name=张三, age=35, id=005, city=武汉, birthday=1987-01-02 05:40:21]

 

分组内排序

对于每组内部按age排序

query.setParam(GroupParams.GROUP_SORT, "user_age asc");// 每组内部按age升序排序

输出:

------------------北京---------------

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=赵六, age=24, id=009, city=北京, birthday=1988-10-24 10:40:21]

User [name=王五, age=25, id=003, city=北京, birthday=1988-10-24 10:40:21]

...

 

city和age分组:

query.setParam(GroupParams.GROUP_FIELD,"user_city","user_age");

可以设置两个字段分组,但是其实相当于分别查了两次,得到两组结果。并不是像mysql中使用组合得到的结果。因此暂时还没找到按city和age一起分组的方法。

 

8) 排序

 

/**

 * 增加排序

 * @param sorts 排序字段 eg.field1,-field2,…… ; -代表降序; 不加前缀为升序

 * @param query 查询条件

 * @return

 */

public static SolrQuery addSorts(String sorts, SolrQuery query) {

    if (Strings.isNullOrEmpty(sorts)) {

        return query;

    }

 

    List<String> list = Splitter.on(",").trimResults().splitToList(sorts);

    for (String sort : list) {

        if (Strings.isNullOrEmpty(sort)) {

            continue;

        }

 

        ORDER order = ORDER.asc;

        String name = sort;

        if (sort.charAt(0) == '-') {

            order = ORDER.desc;

            name = name.substring(1);

        }

        query = query.addSort(name, order);

    }

 

    return query;

}

 

String queryStr = "user_uuid:*";

SolrQuery query = new SolrQuery(queryStr);

query = SolrUtil.addSorts("-user_age,id", query);

SolrDocumentList solrDocumentList = solrDao.getResults(query);

printUser(solrDocumentList);

User [name=张三, age=35, id=005, city=武汉, birthday=1987-01-02 05:40:21]

User [name=张三, age=35, id=007, city=河北, birthday=1980-01-02 05:40:21]

User [name=李四, age=35, id=008, city=河北, birthday=1980-01-02 05:40:21]

User [name=张三, age=34, id=006, city=天津, birthday=1980-01-02 05:40:21]

User [name=王五, age=25, id=003, city=北京, birthday=1988-10-24 10:40:21]

User [name=赵六, age=25, id=004, city=上海, birthday=1988-10-24 10:40:21]

User [name=李四, age=24, id=002, city=北京, birthday=1988-10-24 11:40:21]

User [name=张三, age=23, id=001, city=北京, birthday=1988-10-24 12:40:21]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值