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]
l 按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]
l 分组内排序
对于每组内部按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]
...
l 按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]