SolrJ就是Solr服务器的java客户端。
环境准备
1.JDK1.8
2.SolrJ6.6.2
3.Eclipse
4.Tomcat8
项目结构
所需jar包在/solr-6.6.2/dist
、/solr-6.6.2/dist/solrj-lib
以及/solr-6.6.2/server/lib/ext
下
使用solrj完成索引维护
1.添加/修改索引
在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。
@Test
public void insertAndUpdateIndex() throws Exception {
// 创建HttpSolrClient
HttpSolrClient server = new HttpSolrClient.Builder("http://localhost:8080/solr/new_core").build();
// 创建Document对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "id007");
document.addField("name", "张育嘉");
// 将Document对象添加到索引库
server.add(document);
// 提交
server.commit();
}
2.删除索引
@Test
public void deleteIndex() throws Exception {
// 创建HttpSolrClient
HttpSolrClient server = new HttpSolrClient.Builder("http://localhost:8080/solr/new_core").build();
// 根据ID删除索引
server.deleteById("id007");
// 根据条件删除索引
//server.deleteByQuery("id:id007");
// 全部删除
//server.deleteByQuery("*:*");
// 提交
server.commit();
}
3.查询索引
简单查询
@Test
public void simpleSearch() throws Exception {
// 创建HttpSolrClient
HttpSolrClient server = new HttpSolrClient.Builder("http://localhost:8080/solr/new_core").build();
// 创建SolrQuery
SolrQuery query = new SolrQuery();
// 输入查询条件
query.setQuery("product_name:小黄人");
// 执行查询并返回结果
QueryResponse response = server.query(query);
// 获取所有匹配结果
SolrDocumentList list = response.getResults();
// 获取匹配结果总数
long count = list.getNumFound();
System.out.println("查询结果总数:"+count);
for (SolrDocument solrDocument : list) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("product_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog"));
System.out.println(solrDocument.get("product_picture"));
System.out.println("=================================");
}
}
复杂查询
@Test
public void multiSearch() throws Exception {
// 创建HttpSolrClient
HttpSolrClient server = new HttpSolrClient.Builder("http://localhost:8080/solr/new_core").build();
// 创建SolrQuery
SolrQuery query = new SolrQuery();
// 输入查询条件
query.setQuery("product_name:小黄人 AND product_catalog_name:幽默杂货 OR product_description:商品材质");
// 设置过滤条件
query.setFilterQueries("product_price:[1 TO *]");
// 排序
query.setSort("product_price", ORDER.asc);
// 分页
query.setStart(0);
query.setRows(10);
// 设置需要显示的Field的集合
query.setFields("id,product_name,product_price,product_catalog,product_picture");
// 设置默认域
query.set("df", "product_keywords");
// 设置高亮信息
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<span color='red'>");
query.setHighlightSimplePost("</span>");
// 查询并返回结果
QueryResponse response = server.query(query);
// 获取匹配的所有结果
SolrDocumentList list = response.getResults();
// 匹配结果总数
long count = list.getNumFound();
System.out.println("匹配结果总数:" + count);
// 获取高亮信息
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
// 输出结果
for (SolrDocument solrDocument : list) {
System.out.println(solrDocument.get("id"));
List<String> list2 = highlighting.get(solrDocument.get("id")).get("product_name");
if(list2 != null) {
System.out.println("高亮显示的商品名称:"+list2.get(0));
}else {
System.out.println(solrDocument.get("product_name"));
}
System.out.println(solrDocument.get("product_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog"));
System.out.println(solrDocument.get("product_picture"));
System.out.println("========================================");
}
}
Solr的查询语法
1. q - 查询关键字,必须的,如果查询所有使用*:*
2. fq - (filter query)过虑查询
作用:在q查询符合结果中同时是fq查询符合的,请求fq是一个数组(多个值)
例如:
过滤查询价格从1到20的记录。
也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
也可以使用“*”表示无限,例如:
20以上:product_price:[20 TO *]
20以下:product_price:[* TO 20]
3. sort - 排序
格式:product_price asc,id desc
4. start - 分页显示使用,开始记录下标,从0开始
5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
6. fl - 指定返回那些字段内容,用逗号或空格分隔多个。
7. df - 指定一个默认的搜索Field
8. wt - (writer type)指定输出格式,可以有 xml, json, php, csv, 后面 solr 1.3增加的,默认没有打开。
9. hl - 是否高亮,设置高亮Field,设置格式前缀和后缀。
Solr的Web端
上一篇:《Solr6.6.2之基本使用》