一、solr的介绍
什么是solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:
- 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。
- 搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对 Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
Solr和Lucene的区别
Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索应用。Lucene仅提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索应用。
Solr的目标是打造一款企业级的搜索引擎系统,它是基于Lucene一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
Solr安装配置
下载solr solr6.4.1
bin:solr的运行脚本
contrib:solr的一些扩展jar包,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
- example/solr:
该目录是一个标准的SolrHome,它包含一个默认的SolrCore
- example/multicore:
该目录包含了在Solr的multicore中设置的多个Core目录。
- example/webapps:
该目录中包括一个solr.war,该war可作为solr的运行实例工程。
licenses:solr相关的一些许可信息
solr的安装:
solr安装中文分词器:
solr安装dataimport:
二、Solrj的使用
什么是solrj
Solrj就是solr服务器的java客户端。
三、入门程序
tomcat8、jdk8、solr6.4.1
导jar包
添加、修改、删除索引
public class IndexSolr {
private HttpSolrClient server = null;
private String url = "http://localhost:8080/solr/new_core";// 其中db为自定义的core名称
@Test
public void insertAndUpdate() throws Exception {
// 创建HttpSolrServer
server = new HttpSolrClient.Builder(url).build();
// 创建Document对象
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "c001");
doc.addField("product_name", "solr222");
// 将Document对象添加到索引库
server.add(doc);
// 提交
server.commit();
}
@Test
public void deleteIndex() throws Exception {
server = new HttpSolrClient.Builder(url).build();
// server.deleteById("c001");
server.deleteByQuery("id:c001");
server.commit();
}
}
基本搜索
@Test
public void searcher01() throws Exception {
// 创建HttpSolrServer
server = new HttpSolrClient.Builder(url).build();
// 创建Query对象
SolrQuery query = new SolrQuery();
// 输入查询条件
query.setQuery("product_name:小黄人");
// 执行查询并返回结果集
QueryResponse response = server.query(query);
SolrDocumentList list = response.getResults();
// 匹配结果总数
long numFound = list.getNumFound();
System.out.println("匹配总数为" + numFound);
for (SolrDocument solrDocument : list) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_name"));
System.out.println(solrDocument.get("product_picture"));
System.out.println("==========================");
}
复杂搜索
@Test
public void searcher02() throws Exception {
// 创建HttpSolrServer
server = new HttpSolrClient.Builder(url).build();
// 创建Query对象
SolrQuery query = new SolrQuery();
// 输入查询条件
query.setQuery("product_name:小黄人");
// 设置过滤条件
query.addField("product_price:[1 TO 100]");
// 设置分类排序
query.setSort("product_price", ORDER.desc);
// 设置显示分页信息
query.setStart(0);
query.setRows(10);
// 设置显示的Filed域
query.setFields("id,product_name,product_price,product_catalog");
// 设置默认域
query.set("df", "product_name");
// 设置高亮信息
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
// 执行查询并返回结果集
QueryResponse response = server.query(query);
SolrDocumentList list = response.getResults();
// 匹配结果总数
long numFound = list.getNumFound();
System.out.println("匹配总数为" + numFound);
// 获取高亮显示信息
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));
}
System.out.println(solrDocument.get("product_catalog"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_name"));
System.out.println("==========================");
}
}