使用java实现solr查询
目录:1:导入jar包
一 导入jar包
solrj可以使Java应用程序很方便的访问与操作solr。
solrj有几个核心类,分别为:1.SolrClient 2.SolrRequests 3.SolrQuerys 4.SolrReponses
tips:该jar包可以在${solr.home}/dist 找到
Maven依赖
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>x.y.z</version> </dependency>
Gradle依赖(我这里用的是gradle)
dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') compile group: 'org.apache.solr', name: 'solr-solrj', version: '7.4.0' compile('org.springframework.boot:spring-boot-starter-data-solr') }
二 核心类介绍:
1. SolrClient (操作solr的核心类):
由于SolrClient是抽象的,因此要连接solr的远程服务需要创建HttpSolrClient 或者 CloudSolrClient 对象,两者都是以Http请求与solr通信,只不过前者需要一个明确的solr地址信息,后者是基于zookeeper的地址并对solrCloud进行操作,在这里是基于前者的教程
创建代码:
String urlString = "http://localhost:8983/solr/test"; SolrClient solr = new HttpSolrClient.Builder(urlString).build();
solrClient常用方法:
public UpdateResponse add(String collection, SolrInputDocument doc) throws SolrServerException, IOException |
向solr中添加一条数据 参数: collection:在对应的core中添加数据 doc:该参数封装了具体要添加的值 |
public UpdateResponse addBean(String collection,Object obj) throws IOException, SolrServerException |
将对应的bean添加至文档索引当中 |
public UpdateResponse commit(String collection) throws SolrServerException, IOException |
提交本次操作的数据 |
public UpdateResponse rollback(String collection) throws SolrServerException, IOException |
回滚本次操作的数据 |
public UpdateResponse deleteById(String collection, String id) throws SolrServerException, IOException |
根据唯一索引删除索引信息 |
public UpdateResponse deleteByQuery(String collection, String query) throws SolrServerException, IOException |
根据查询删除索引里的文档信息 |
public SolrDocument getById(String id, SolrParams params) throws SolrServerException, IOException |
根据ID进行查询 |
public QueryResponse query(String collection, SolrParams params, METHOD method) throws SolrServerException, IOException |
查询方法 参数: collection:查询的core solrParams:查询参数对象 method:Http请求方式 |
2.SolrDocumentBase
该类是抽象类,并实现Map接口,子类包含SolrDocument和SolrInputDocument。该类主要作用是代表了solr索引中的一条数据信息,对象中的field值必须在magage-schema中定义。通常需要操作solr索引字段时用到SolrInputDoucument
该类常用方法:
void addField(String name, Object value) |
向solr中索引中添加一个Field |
Object getFieldValue(String name) |
根据field获取对应的第一个值或者一组值 |
Collection<String> getFieldNames() |
获取所有的Fields信息 |
3.SolrParams
该类是抽象类,主要用于封装与solr请求时所传的参数信息。该类最常用的子类为SolrQuery, SolrQuery类提供了查询所需的分组,高亮,排序等方法
3.1 SolrInputDocument:
void addField(String name, Object value) |
在索引添加一条Field对应的值 |
void setField(String name, Object value) |
在索引中更新一条Field对应的值 |
3.2 SolrQuery:
ModifiableSolrParams set( String name, String ... val ) |
设置对应的查询参数,具体见下方实例 |
SolrQuery addHighlightField(String f) |
添加高亮显示字段 |
SolrQuery addFilterQuery(String ... fq) |
添加过滤字段 |
SolrQuery addSort(String field, ORDER order) |
添加排序字段 |
4.SolrResponse
该类是抽象类,主要用于solr对用户请求之后做出的响应。
三 代码实现
package com.example.solrdemo; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * @Author:lyf * @Description:YanFei.Liu * @Program: Main * @Date: 2018/7/9 8:56 */ public class Main { private static final String SOLR_URL = "http://localhost:8983/solr/test"; public static void main(String[] args) throws SolrServerException, IOException { //创建solr客户端连接 HttpSolrClient hsc = new HttpSolrClient.Builder(SOLR_URL).build(); //创建查询对象 SolrQuery query = new SolrQuery(); //query.setQuery("*:*");//设置查询全部数据的条件 query.setQuery("stuname:酒店"); //列名:值 List<Map<String, Object>> list = getSolrQuery(hsc, query); if (list == null) { System.out.println("未查询到任何结果"); return; } for (Map<String, Object> map : list) { Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = it.next(); Object value = map.get(key); System.out.println(key + "----" + value); } System.out.println("======================================="); } } public static List<Map<String, Object>> getSolrQuery(HttpSolrClient client, SolrQuery query) throws SolrServerException, IOException { List<Map<String, Object>> list = null; //执行查询并返回结果 QueryResponse resp = client.query(query); SolrDocumentList results = resp.getResults(); //获取查询到的数据总量 long numFound = results.getNumFound(); //判断总量是否大于0, if (numFound <= 0) { //如果小于0,表示未查询到任何数据,返回null return null; } else { //如果大于0,表示有数据 //创建list存储每条数据 list = new ArrayList<>(); //遍历结果集 for (SolrDocument doc : results) { //得到每条数据的map集合 Map<String, Object> map = doc.getFieldValueMap(); //添加到list list.add(map); } //返回list集合 return list; } } }
可以看出主要用的是solrj中的client和common
有兴趣的可以自己探究一下solrj里的源码
四 注意事项
这是solr的code,查询一定要带上
如果不带的话就会报如下错误: