添加SolrJ的jar包
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.4</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
创建索引
使用SolrJ创建索引,通过调用SolrJ提供的API请求Solr服务,Document通过SolrInputDocument进行构建。
// 创建索引
public static void createIndex() throws Exception {
SolrServer solrServer = new HttpSolrServer("http://192.168.50.50:8080/solr/collection1");
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "00001");
document.addField("name", "solr全文检索");
document.addField("price", 86.5f);
document.addField("description", "这是一本关于solr的书籍!");
UpdateResponse response = solrServer.add(document);
solrServer.commit();
}
删除索引
//删除索引
public void deleteIndex() throws Exception {
SolrServer solrServer = new HttpSolrServer(solrUrl);
//根据id删除
UpdateResponse response = solrServer.deleteById("c0001");
//根据多个id删除
solrServer.deleteById("0001,0002");
//自动查询条件删除
solrServer.deleteByQuery("name:教程");
solrServer.commit();
}
搜索索引
//查询索引
public static void selectIndex() throws Exception {
SolrServer solr = new HttpSolrServer(solrUrl);
// 查询对象
SolrQuery query = new SolrQuery();
//设置查询条件,名称“q”是固定的且必须的
//搜索keywords域,keywords是复制域包括name和description
query.set("q", "keywords:java教程");
// 设置商品分类、关键字查询
query.setQuery("name:数据 AND price:11.1");
// 设置价格范围
query.set("fq", "price:[1 TO 20]");
// 查询结果按照价格降序排序
//query.set("sort", "price desc");
query.addSort("price", ORDER.desc);
// 请求查询
QueryResponse response = solr.query(query);
// 查询结果
SolrDocumentList docs = response.getResults();
// 查询文档总数
System.out.println("查询文档总数" + docs.getNumFound());
for (SolrDocument doc : docs) {
String id = (String) doc.getFieldValue("id");
String name = (String)doc.getFieldValue("name");
Float price = (Float)doc.getFieldValue("price");
String description = (String)doc.getFieldValue("description");
System.out.println(id);
}
}
高亮搜索索引
// 分页和高亮
public static void selectHeightLight() throws Exception {
SolrServer solr = new HttpSolrServer(solrUrl);
// 查询对象
SolrQuery query = new SolrQuery();
// text是name、title等众多字段的复制域
query.setQuery("text:算");
// 每页显示记录数
int pageSize = 2;
// 当前页码
int curPage = 1;
// 开始记录下标
int begin = pageSize * (curPage - 1);
// 起始下标
query.setStart(begin);
// 结束下标
query.setRows(pageSize);
// 设置高亮参数
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("name");// 高亮字段
query.setHighlightSimplePre("<span color='red'>");//前缀标记
query.setHighlightSimplePost("</span>");// 后缀标记
// 请求查询
QueryResponse response = solr.query(query);
// 查询结果
SolrDocumentList docs = response.getResults();
// 查询文档总数
System.out.println("查询文档总数" + docs.getNumFound());
for (SolrDocument doc : docs) {
// 商品主键
String id = (String) doc.getFieldValue("id");
// 商品名称
String name = (String)doc.getFieldValue("name");
// 高亮信息
if(response.getHighlighting() != null) {
if(response.getHighlighting().get(id) != null) {
// 取出高亮片段
Map<String, List<String>> map = response.getHighlighting().get(id);
if(map.get("name") != null) {
for(String s : map.get("name")) {
System.out.println(s);
}
}
}
}
}
}