一、solr目录简介
-
bin: Windows及Linux下的可执行文件
-
contrib: solr扩展库(solr的一些贡献软件/插件,用于增强solr的功能)
-
dist : solr编译(build)过程的jar包文件,以及相关的jar包引用
-
docs:API文档
-
example : solr的工程例子
-
licenses : 和solr相关的一些许可信息
-
server: solr web应用(webapps)相关配置(什么lib啊、conf啊、web.xml啊...)
二、solr整合tomcat
- solr执行环境
-
solr需要运行在servlet容器中,Solr4.10.3要求jdk使用1.7以上,solr默认提供Jetty(java写的servlet容器)。本次受用tomcat:环境如下
-
(1)、Solr:solr4.10.3
-
(2)、jdk:jdk1.8
-
(3)、tomcat:8.0
2.solr整合tomcat需要三部
-
1、将solr.war包复制到tomcat下的webapps文件夹下并解压,然后删除war包
-
2、将solr下的example->lib-->下的依赖包复制到tomcat下webapps下solr文件夹下的lib下
- 3、新建文件夹,将solr下example-->ext-->solr->下的所有文件复制到新建文件夹下,并且修改tomcat下的webapps下的solr文件夹下的web.xml文件
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<!-- solr家的地址 -->
<env-entry-value>D:\Program Files\solr\solrHome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
3.solr中solrhome家中collection1(盒)中schema.xml中域的解析
标签 | 说明 | 默认值 |
---|---|---|
filed | 表示域 | |
name | 表示域名 | |
type | 表示域的类型 | |
indexed | 字段值是否用于查询 | true |
stored | 字段真实值是否可以被查询到 | true |
required | 是否拒绝空值的字段 | false |
multiValued | 表示是否多值 | false |
fieldType | 表示类型 | |
dynamicField | 表示动态域 | |
copyField | 拷贝域 |
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
4.IK分词解析器配置
-
将IKAnalyzer2012FF_u1.jar放入到tomcat下solr下的lib文件夹下
-
将分词解析器的配置文件放入到编译后的文件夹下(和lib同级下的classes文件夹下)
-
在solrHome下的collection1下的schema.xml中配置分词域
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true" />
5.批量导入数据
将Solr-->dist-->solr-dataimporthandler-4.10.3.jar和solr-dataimporthandler-extras-4.10.3.jar复制到solrHome-->collection1-->lib下(如果美哟lib就创建)同时放入mysql驱动到此文件夹下
在solrConfig.xml中配置批量导入
<!-- 配置批量导入 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
在同级目录下创建data-config-xml文件
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="123456"/>
<document>
<entity name="green" query="SELECT Greens_ID,Greens_Type_Name,Greens_Name,Greens_Unit,Greens_Preiod,Greens_Number,Greens_Price,Greens_Market_Price,Greens_Minnumber,Greens_Class,Greens_Remark,Greens_Time,Greens_tupian,Greens_Stop,Greens_BigName FROM greens">
<field column="Greens_ID" name="id"/>
<field column="Greens_Type_Name" name="greensTypeName"/>
<field column="Greens_Name" name="greensName"/>
<field column="Greens_Unit" name="greensUnit"/>
<field column="Greens_Preiod" name="greensPreiod"/>
<field column="Greens_Number" name="greensNumber"/>
<field column="Greens_Price" name="greensPrice"/>
<field column="Greens_Market_Price" name="greensMarketPrice"/>
<field column="Greens_Minnumber" name="greensMinnumber"/>
<field column="Greens_Class" name="greensClass"/>
<field column="Greens_Remark" name="greensRemark"/>
<field column="Greens_Time" name="greensTime"/>
<field column="Greens_tupian" name="greensTupian"/>
<field column="Greens_Stop" name="greensStop"/>
<field column="Greens_BigName" name="greensBigType"/>
</entity>
</document>
</dataConfig>
在schema.xml文件中配置域
<!-- 配置分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true" />
<!-- greens -->
<field name="greensTypeName" type="text_ik" indexed="true" stored="true"/>
<field name="greensName" type="text_ik" indexed="true" stored="true"/>
<field name="greensUnit" type="string" indexed="false" stored="true"/>
<field name="greensPreiod" type="string" indexed="true" stored="true"/>
<field name="greensNumber" type="int" indexed="false" stored="true"/>
<field name="greensPrice" type="float" indexed="false" stored="true"/>
<field name="greensMarketPrice" type="float" indexed="false" stored="true"/>
<field name="greensMinnumber" type="int" indexed="false" stored="true"/>
<field name="greensClass" type="text_ik" indexed="true" stored="true"/>
<field name="greensRemark" type="text_ik" indexed="true" stored="true"/>
<field name="greensTime" type="string" indexed="true" stored="true"/>
<field name="greensTupian" type="string" indexed="true" stored="true"/>
<field name="greensStop" type="int" indexed="false" stored="true"/>
<field name="greensBigType" type="text_ik" indexed="true" stored="true"/>
<!-- 拷贝域 -->
<field name="greens_keywords" type="text_ik" indexed="true" stored="false" multiValued="true" />
<copyField source="greensTypeName" dest="greens_keywords"/>
<copyField source="greensName" dest="greens_keywords"/>
<copyField source="greensClass" dest="greens_keywords"/>
<copyField source="greensRemark" dest="greens_keywords"/>
<copyField source="greensBigType" dest="greens_keywords"/>
三、客户端solrj
1、导入jar包
-
将D:\Program Files\solr\solr-4.10.3\dist文件夹下的solr-solrj-4.10.3.jar包导入到项目中
-
将D:\Program Files\solr\solr-4.10.3\dist\solrj-lib下的所有jar包导入到项目中
-
将D:\Program Files\solr\solr-4.10.3\example\lib\ext下的所有jar包导入到项目中
2、solr添加操作
-
solrj批量添加
/**
* solrj添加操作
* @throws SolrServerException
* @throws IOException
*/
@Test
public void addTest() throws SolrServerException, IOException{
GreensDaoImpl dao = new GreensDaoImpl();
String baseURL = "http://localhost:8080/solr/collection1";
// String baseURL = "http://localhost:8080/solr/collection2";
List<Greens> all = dao.findAll();
for (Greens greens : all) {
SolrServer solrServer = new HttpSolrServer(baseURL);
//System.out.println( greens.getGreens_ID());
SolrInputDocument sid = new SolrInputDocument();
sid.addField("id", greens.getGreens_ID());
sid.addField("greensTypeName", greens.getGreens_Type_Name());
sid.addField("greensName", greens.getGreens_Name());
sid.addField("greensUnit", greens.getGreens_Unit());
sid.addField("greensPreiod", greens.getGreens_Preiod());
sid.addField("greensNumber", greens.getGreens_Number());
sid.addField("greensPrice", greens.getGreens_Price());
sid.addField("greensMarketPrice", greens.getGreens_Market_Price());
sid.addField("greensMinnumbera", greens.getGreens_Minnumber());
sid.addField("greensClass", greens.getGreens_Class());
sid.addField("greensRemark", greens.getGreens_Remark());
sid.addField("greensTime", greens.getGreens_Time());
sid.addField("greensTupian", greens.getGreens_tupian());
sid.addField("greensStop", greens.getGreens_Stop());
sid.addField("greensBigType", greens.getBigType());
solrServer.add(sid);
solrServer.commit();
}
}
3、solrj删除操作
/**
* solr删除操作
* @throws IOException
* @throws SolrServerException
*/
@Test
public void deleteTest() throws SolrServerException, IOException{
String baseURL = "http://localhost:8080/solr/collection1";
SolrServer solrServer = new HttpSolrServer(baseURL);
solrServer.deleteByQuery("*:*", 1000);
}
4、solrj修改操作
/**
* solrJ修改操作
*/
@Test
public void updateTest(){
String baseURL = "http://localhost:8080/solr/collection1";
SolrServer solrServer = new HttpSolrServer(baseURL);
/**
* 与添加相同,只要id相同为修改操作,id不同为修改操作
*/
}
5、solrj查找操作
/**
* solrj查找操作
* @throws SolrServerException
* "id": "3",
"greensTypeName": "叶菜类",
"greensName": "娃娃菜",
"greensUnit": "包",
"greensPreiod": "3日",
"greensNumber": 10000,
"greensPrice": 5,
"greensMarketPrice": 6,
"greensMinnumbera": 1,
"greensClass": "兰州",
"greensRemark": "质保期8小时",
"greensTime": "2019-08-15 03:48:37",
"greensTupian": "娃娃菜(包).jpg",
"greensStop": 0,
"greensBigType": "新鲜蔬菜",
*/
@Test
public void queryTest() throws SolrServerException{
String baseURL = "http://localhost:8080/solr/collection1";
SolrServer solrServer = new HttpSolrServer(baseURL);
/**
* 需求:
* 查询关键词为肉,过滤条件为猪肉,价格排序,分页,开始行,每页显示的条数,高亮显示,默认域,只查询指定域
*/
SolrQuery solrParams = new SolrQuery();
//关键词
//solrParams.set("q", "greensName:肉");
solrParams.setQuery("肉");
//过滤条件
solrParams.set("fq", "greensTypeName:猪肉");
//价格排序
//solrParams.set("fq", "greensPrice:[* TO 10]");
//对价格排序
solrParams.addSort("greensPrice", ORDER.desc);
//分页
solrParams.setStart(0);
solrParams.setRows(5);
//默认域
solrParams.set("df", "greens_keywords");
//只查询指定域
solrParams.set("fl", "id,greensTypeName,greensName,greensPrice,greensClass,greensRemark,greensBigType");
//高亮显示
//打开高亮
solrParams.setHighlight(true);
//指定高亮域
solrParams.addHighlightField("greensName");
//指定高亮域前缀
solrParams.setHighlightSimplePre("<span style='color:red;'>");
//指定高亮域后缀
solrParams.setHighlightSimplePost("</span>");
//执行查询
QueryResponse response = solrServer.query(solrParams);
//返回结果集
SolrDocumentList docs = response.getResults();
//总条数
long totalNumFound = docs.getNumFound();
System.out.println("===>"+totalNumFound);
//高亮结果集
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
//便利结果集
for (SolrDocument doc : docs) {
Map<String, List<String>> map = highlighting.get(doc.get("id"));
List<String> list = map.get("greensName");
System.out.println(list.get(0)+"------------------------");
System.out.println(doc.get("id"));
System.out.println(doc.get("greensTypeName"));
System.out.println(doc.get("greensName"));
System.out.println(doc.get("greensUnit"));
System.out.println(doc.get("greensPreiod"));
System.out.println(doc.get("greensNumber"));
System.out.println(doc.get("greensPrice"));
System.out.println(doc.get("greensMarketPrice"));
System.out.println(doc.get("greensClass"));
System.out.println(doc.get("greensRemark"));
System.out.println(doc.get("greensTime"));
System.out.println(doc.get("greensTupian"));
System.out.println(doc.get("greensStop"));
System.out.println(doc.get("greensBigType"));
}
}
四、solr整合三大框架
只需要在Spring-MVC.xml中加入以下代码就行
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg value="http://localhost:8080/solr/collection1"></constructor-arg>
</bean>