solr作为一款开源的全文检索框架,为业务系统实现全文检索提供了索引支撑,
使用solr需要搞清以下几个概念:
1、实例
实例 - 就像一个tomcat
实例或一个jetty
实例,这个术语指的是在JVM中运行的应用程序服务器。Solr主目录提供对每个这些Solr实例的引用,一个或多个核心可以配置在每个实例中运行。
2、核心
核心(core) - 在应用程序中运行多个索引时,可以在每个实例中拥有多个核心,而不是每个核心的多个实例。
3、配置文件
Solr.xml - 它是包含Solr Cloud相关信息,此文件是在$SOLR_HOME
目录中。 为了加载核心,Solr引用这个文件,这有助于识别它们。
Solrconfig.xml − 此文件包含与请求处理和响应格式化相关的定义,核心特定配置,以及索引,配置,管理内存和提交。
Schema.xml − 添加到solr中的索引实体及字段的定义,此文件包含整个模式以及字段和字段类型。
Core.properties - 此文件包含特定于核心的配置。它被引用为核心发现,因为它包含核心的名称和数据目录的路径。它可以在任何目录中使用,会将此目录它视为核心目录。
4、索引
在下表中,我们列出了Apache Solr中提供的各种常用的一些查询参数。
参数 | 描述 |
---|---|
q | 这是Apache Solr的主要查询参数,文档根据它们与此参数中的术语的相似性来评分。 |
fq | 这个参数表示Apache Solr的过滤器查询,将结果集限制为与此过滤器匹配的文档。 |
start | start 参数表示页面的起始偏移量,此参数的默认值为0 。 |
rows | 这个参数表示每页要检索的文档的数量。此参数的默认值为10 。 |
sort | 这个参数指定由逗号分隔的字段列表,根据该列表对查询的结果进行排序。 |
fl | 这个参数为结果集中的每个文档指定返回的字段列表。 |
wt | 这个参数表示要查看响应结果的写入程序的类型。 |
5、数据导入
dataimport-Handler介绍
solr提供dataimport-Handler数据导入处理器,工作流程:
1、solr通过dataimport-Handler查询关系数据库中的数据
2、对查询到的数据创建索引
上边的过程是自动化完成的。
可以通过此dataimport-Handler,批量将关系数据库中的数据创建索引到solr索引库中。
第一步:加载dataimport的jar包
将solr\dist\ solr-dataimporthandler-4.10.3.jar拷贝至solr\contrib\dataimporthandler
配置solrconfig.xml加载jar包:
<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
第二步:加载mysql数据驱动包
方法同上,将mysql数据库驱动的jar拷贝至solr\contrib\databaseDriver下
配置solrconfig.xml加载jar包:
<lib dir="${solr.install.dir:../..}/contrib/databaseDriver/lib" regex=".*\.jar" />
第三步:配置dataimport导入数据
创建data-config.xml文件,存放在SolrCore的conf目录
第四步:修改solrconfig.xml,添加requestHandler
第五步:测试数据导入
6、代码集成
服务地址如果设置成solr server地址,不包含合并表示请求发送到所有核心,服务地址如果指定到核心,则请求只发送给特定核心处理。
public class SolrManager {
/**
* 添加文档数据到solr服务器中
* @throws Exception
*/
@Test
public void addContent() throws Exception{
//设置solr服务器的路径,默认是使用第一个collection库,所以路径最后可以不加collection1
String baseURL = "http://localhost:8080/solr";
//如果要使用第二个collection库,那么就使用下面的链接
//String baseURL2 = "http://localhost:8080/solr/collection2";
//创建服务器连接对象
HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
//创建新的文档对象
SolrInputDocument solrInputDocument = new SolrInputDocument();
//设置文档的域
solrInputDocument.setField("id", "haha222");
solrInputDocument.setField("name", "佘超伟123");
//进行添加
httpSolrServer.add(solrInputDocument);
//进行手动提交,否则无法进行添加
httpSolrServer.commit();
}
/**
* 进行删除文档操作
* @throws SolrServerException
* @throws IOException
*/
@Test
public void deleteContent() throws Exception{
String baseURL = "http://localhost:8080/solr";
SolrServer httpSolrServer = new HttpSolrServer(baseURL);
//删除全部,第一个参数是设置需要删除的数据的域和值,第二个是执行后多久进行删除操作
//httpSolrServer.deleteByQuery("*:*",1000);
//删除某个特定域的特定值的数据
httpSolrServer.deleteByQuery("id:haha",1000);
}
/**
* 修改文档内容
* 修改其实和添加是一样的,因为只要添加的ID是一样的,那么就会把原来的删除了,然后再添加一个
* @throws IOException
* @throws SolrServerException
*/
@Test
public void updateContent() throws SolrServerException, IOException{
String baseURL = "http://localhost:8080/solr";
SolrServer httpSolrServer = new HttpSolrServer(baseURL);
//创建新的文档对象
SolrInputDocument solrInputDocument = new SolrInputDocument();
//设置文档的域
solrInputDocument.setField("id", "haha123");
solrInputDocument.setField("name", "哈哈123");
httpSolrServer.add(solrInputDocument);
}
/**
* 查询数据(多功能的显示处理)
* @throws Exception
*/
@Test
public void queryContent() throws Exception{
String baseURL = "http://localhost:8080/solr";
SolrServer httpSolrServer = new HttpSolrServer(baseURL);
//创建查询数据对象(便于设置查询条件)
SolrQuery solrQuery = new SolrQuery();
//设置查询的域和值,这个在之后的项目中可以用于动态
//方法一:参数q就代表query查询
//solrQuery.set("q","name:佘超伟123");
//方法二:(一般使用该方法)
solrQuery.setQuery("name:佘超伟");
//方法三:通过设置默认域
//solrQuery.set("df", "name");
//solrQuery.setQuery("佘超伟");
//设置查询过滤条件(可以设置多个,只要域和值有改变就可以了)
//solrQuery.set("fq", "id:haha123");
//添加排序方式(可选内容)
//solrQuery.addSort("需要排序的域",ORDER.asc);//升序
//solrQuery.addSort("需要排序的域",ORDER.desc);//降序
//设置分页处理(比如这是设置每次显示5个)
solrQuery.setStart(0);
solrQuery.setRows(5);
//设置只查询显示指定的域和值(第二个参数可以是多个,之间用“逗号”分割)
//solrQuery.set("fl", "name");
//设置某域进行高亮显示
solrQuery.setHighlight(true);
solrQuery.addHighlightField("name");
//设置高亮显示格式的前后缀
solrQuery.setHighlightSimplePre("<span style='color:red'>");
solrQuery.setHighlightSimplePost("</span");
//执行查询,获得查询结果对象
QueryResponse query = httpSolrServer.query(solrQuery);
//获取查询的结果集
SolrDocumentList results = query.getResults();
//获取高亮显示的查询结果
//注意点:因为高亮的结果和正常的查询结果是不一样的,所以要进行特别的处理
Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
//遍历结果集
for (SolrDocument solrDocument : results) {
String idStr = (String) solrDocument.get("id");
System.out.println("id----------------" + idStr);
String nameStr = (String) solrDocument.get("name");
System.out.println("name----------------" + nameStr);
System.out.println("===========高亮显示=====================");
Map<String, List<String>> map = highlighting.get(idStr);
List<String> list = map.get("name");
String resultString = list.get(0);
System.out.println("高亮结果为:-----" + resultString);
}
}
}