sorl学习笔记
sorl是基于luncene开发的一个框架,具体就不多解释了,主要是说一下怎么实现
首先简单说一下内容吧!
- solr:可视化的后台管理器
- solrj:提供给java编程的
一、solr
solr安装和基本配置步骤:
- 去官网下载solr压缩包;
- 环境要求:tomcat,jdk,所以也要下载这两个东西,并安装配置好;
- 开始整合solr和tomcat,下面就是整合的步骤:
- 把\solr-4.10.3\dist\solr-4.10.3.war复制到tomcat的webapps里面,在当前路径新建一个solr文件夹,把war包的内容解压到solr文件夹里,删除war包;
- 把\solr-4.10.3\example\lib\ext下所有的jar包copy到tomcat的solr工程里面的lib文件夹里;
- 创建一个solrhome文件夹,例如:C:\temp\solrhome\;
- 把\solr-4.10.3\example\solr\路径下的所有内容拷贝到C:\temp\solrhome\里面;
- 为了让solr服务器知道solrhome的位置,要修改tomcat里面solr的配置,就是修改web.xml文件,如下
<!--这段代码本来是被注解的,要自己把注解去掉,修改env-entry-value那里-->
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>C:\temp\solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
solrhome文件夹解释
- 在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离。
- 在collection1中有一个文件夹叫做conf,包含了索引solr实例的配置信息。
- 在conf文件夹下有一个solrconfig.xml。配置实例的相关信息。如果使用默认配置可以不用做任何修改。
- 在collection1中有一个lib文件夹,没有就手动创建,是solr服务依赖的扩展包。
- 在collection1中有一个data文件夹,没有的话程序会自动创建,配置了索引库的存放路径。
新建一个Sorlcore:只要复制collection1,再重命名粘贴到同一目录下就可以了,比如重命名为collection2,并且还要修改collection2\core.properties文件内容为 name=collection2
这时启动tomcat访问http://localhost:8080/solr/就可以访问solr后台管理界面了。
solr后台管理界面的基本使用
说在前面:因为我们通常都是在处理中文文件,所以一般都是需要用到中文分析器的,这里推荐使用IK分析器,下面简单说一下配置IK分析器的步骤。
首先把IK分析器的jar包丢到tomcat里面的solr工程里,同时也复制IK分析器的配置文件和自定义词典和停用词词典到solr的classpath下,然后在solrhome里面找到collection1\conf\schema.xml文件,在该文件的后面</schema>
标签之前,添加以下代码:
<!-- IKAnalyzer,其实就是自定义fieldType-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<!--IKAnalyzer Field,其实就是用上面的fieldType定义field-->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
在sorl里面field的名字是不可以随便取的,要符合schema.xml配置文件的要求,这里就不多说这方面的事情了。
在Core selector那里找到collection1,选中他就可以进入下面的操作了,主要说三个操作Document,query和Dataimport
1.Document:创建索引,更新索引和删除索引
创建和更新建议使用json,删除则用xml
1.创建索引的格式:
就直接按json的格式就可以了,例如{“id”:”123456”,”title_ik”:”测试标题”}。
2.更新索引的格式:
更新类似添加,其实就是先删除再添加,如果id存在就是更新,不存在就是添加。
3.删除索引的格式如下:
a.删除制定ID的索引
<delete>
<id>1</id>
</delete>
<commit/>
b.删除查询到的索引数据
<delete>
<query>product_catalog_name:衣服</query>
</delete>
<commit/>
c.删除所有索引数据
<delete>
<query>*:*</query>
</delete>
<commit/>
2.Dataimport:导入外部数据建立索引,例如mysql数据库的数据
- 把\solr-4.10.3\dist\下的两个名字带dataimport的jar包复制到collection1\lib中;
- 再把mysql的驱动jar也复制到collection1\lib中;
- 在collection1\conf\solrconfig.xml文件中添加以下代码,其实就是添加一个requestHandler:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
- 在collection1\conf\下新建一个data-config.xml文件,并且在里面添加以下代码:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solrData"
user="root"
password="root"/>
<document>
<entity name="product" query="SELECT p_id,p_name,p_catalog_name,p_price,p_description,p_picture FROM products ">
<field column="p_id" name="id"/>
<field column="p_name" name="product_name"/>
<field column="p_catalog_name" name="product_catalog_name"/>
<field column="p_price" name="product_price"/>
<field column="p_description" name="product_description"/>
<field column="p_picture" name="product_picture"/>
</entity>
</document>
5.这时候就可以导入mysql里面的数据了吗?还不行,还要为上面的业务系统自定义相关的field,也就是还需要在schema.xml配置文件中加入下面代码:
<!--product-->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price" type="float" indexed="true" stored="true"/>
<field name="product_description" type="text_ik" indexed="true" stored="false" />
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>
到这里就差不多了,确实配置挺多东西的。
3.query:查询索引
- q - 查询字符串,必须的,如果查询所有使用
*:*
。 - fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:
product_price:[1 TO 15]
也可以使用“*”表示无限,例如:
15以上:product_price:[15 TO *]
15以下:product_price:[* TO 15] - sort - 排序,格式:sort=
<field name>+<desc|asc>[,<field name>+<desc|asc>]…
。示例:product_price desc
- start - 分页显示使用,开始记录下标,从0开始
- rows - 指定返回结果最多有多少条记录,配合start来实现分页。
- fl - 指定返回那些字段内容,用逗号或空格分隔多个。
- df-指定一个默认搜索Field,其实也可以在conf/solrconfig.xml文件中指定默认搜索Field。
- wt - (writer type)指定输出格式,可以有 xml, json, php, phps
- hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
二、solrj
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。
1.增、改、删
基本步骤:
1. 依赖的jar包:solr-4.10.3\dist\
路径下的solr-solrj-4.10.3.jar和solrj-lib文件夹里面的所有jar包。
2. 需要的jar包: solr-4.10.3\example\lib\ext\
路径下所有的jar包也需要。
3. 和Solr服务器建立连接。HttpSolrServer对象建立连接。
4. 创建一个SolrInputDocument对象,然后添加域。
5. 将SolrInputDocument添加到索引库。
6. 提交。
实现这些操作的代码:
//通过sorlj插入一个文档
@Test
public void addDocument() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个文档对象
SolrInputDocument document=new SolrInputDocument();
//3.向文档中添加域
document.addField("id", "c5luo45678");
document.addField("title_ik", "使用solrj添加的文档");
document.addField("content_ik", "这就是它的那些无聊的内容,无聊透顶了,没什么好看的。");
document.addField("product_name", "这是一个商品名称");
//4.把document对象添加到索引库
solrServer.add(document);
//5.提交修改
solrServer.commit();
}
//根据id删除文档
@Test
public void deleteDocumentById() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
solrServer.deleteById("c5luo45678");
solrServer.commit();
}
//根据条件删除
@Test
public void deleteDocumentByQuery() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
//修改文档
//solrj里面的修改文档使用的是添加文档的方法,只要id存在就是修改(删除存在的,添加新的),不存在就添加
@Test
public void updateDocument() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个文档对象
SolrInputDocument document=new SolrInputDocument();
//3.向文档中添加域
document.addField("id", "c5luo45678");
document.addField("title_ik", "我已经不是当初的我了");
document.addField("content_ik", "我还是那么的无聊");
document.addField("product_name", "换了个无聊的名字");
//4.把document对象添加到索引库
solrServer.add(document);
//5.提交修改
solrServer.commit();
}
2.查询
大概步骤:
- 建立一个和solr服务器的链接,new一个HttpSolrServer对象;
- 创建一个query对象;
- 往这个query对象里面添加各种各样的查询条件等;
- 然后用HttpSolrServer对象来执行这个query的查询,其实就是抛给solr服务器查询;
- 最后根据自己的需求取查询结果。
//先来个简单查询
@Test
public void testQueryIndex() throws SolrServerException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个query对象
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.setQuery("*:*");
//4.执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
//6.输出查询到的商品总数目
System.out.println("一共查询到的商品数量为:"+solrDocumentList.getNumFound());
//7.遍历查询结果
for (SolrDocument solrDocument : solrDocumentList) {
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_name"));
System.out.println(solrDocument.get("product_picture"));
}
}
//来个复杂查询,包含查询、过滤、分页、排序、高亮显示等处理
@Test
public void testQueryIndex2() throws SolrServerException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个query对象
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.setQuery("台灯");
//4.设置过滤条件
query.setFilterQueries("product_price:[10 TO 200]");
//5.设置排序规则
query.setSort("product_price", ORDER.asc);
//6.分页处理
query.setStart(0);
query.setRows(20);
//7.设置结果需要包含的域
query.setFields("id","product_name","product_price");
//8.设置默认搜索域
query.set("df", "product_keywords");
//9.高亮显示搜索的关键词,只是product_name
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<span color:'red'>");
query.setHighlightSimplePost("<span>");
//*****************************************************
//10.执行查询
QueryResponse queryResponse = solrServer.query(query);
//11.获取结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
System.out.println("结果的数量:"+solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
String id = (String)solrDocument.get("id");
System.out.println(id);
//获取高亮内容
String product_name="";
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<String> list = highlighting.get(id).get("product_name");
//判断是否有高亮内容,因为默认查询的域是product_keywords,所以有可能关键字不一定在product_name里面,所以就会有些没有高亮
if(list!=null){
product_name=list.get(0);
}else{
product_name=(String) solrDocument.get("product_name");
}
System.out.println(product_name);
System.out.println(solrDocument.get("product_price"));
System.out.println("-------------------------------------------");
}
}