Solr-8.10.1版本参考:Solr 之 Linux 安装 solr-8.10.1
Solr 之 Linux 安装 solr-4.10.3
相关文件
Linux: CentOS 7 64位
Jdk: 1.8.0_231
Tomcat: 9.0.19
Solr: solr-4.10.3
中文分词器: IK Analyzer 2012FF_hf1
solr-4.10.3 提取码:solr
Tomcat 9.0.19 提取码:tomc
IK Analyzer 2012FF_hf1 提取码:ikan
solr-4.10.3 相关目录
bin: 提供一个 solr 的 启动 命令,采用 jetty (类似于tomcat)
contrib: solr 扩展包
dist: 提供了:solr-4.10.3.war,需要把该包部署到tomcat;solr-solrj-4.10.3.jar:solr客户端
example: 里面有一个solr目录很重要,可以作为solrhome
IK Analyzer 2012FF_hf1
主要jar包:IKAnalyzer2012FF_u1.jar
在 solr-4.10.3/example/solr/collection1/conf 下:
- schema.xml:定义solr使用的所有的业务域
- solrconfig.xml: 配置solr服务的相关配置
一、搭建 Solr 服务器
1. 上传并解压Solr相关文件
jkd 的安装就不说了
rz -e //上传文件
tar zxf solr-4.10.3.tgz.tgz
tar zxf # tar zxf apache-tomcat-9.0.19.tar.gz
unzip -d IK\ Analyzer\ 2012FF\ hf1 IK_Analyzer_2012FF_hf1.zip
解压后:
2. 配置
-
把 tomcat 复制到
/usr/local/solr
,把 solr 复制到/usr/local/solr/tomcat/webapps/
mkdir /usr/local/solr cp -r apache-tomcat-9.0.19 /usr/local/solr/tomcat // 复制文件夹要加 -r cp solr-4.10.3/dist/solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war
-
启动并关闭tomcat:
/usr/local/solr/tomcat/bin/startup.sh /usr/local/solr/tomcat/bin/shutdown.sh // 关闭tomcat tailf /usr/local/solr/tomcat/logs/catalina.out //查看tomcat日志
注意:只有启动并关闭之后才可以删除 webapps下的solr.war
-
复制日志相关jar包到solr:
cp -rf solr-4.10.3/example/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
-
配置solrhome
mkdir /usr/local/solr/solrhome cp -rf solr-4.10.3/example/solr/* /usr/local/solr/solrhome/
-
告诉 solr 服务器 solrhome 的位置:
修改solr工程的web.xml:vim /usr/local/solr/tomcat/webapps/solr/WEB-INF/web.xml
找到下面的地方
修改为:<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solr/solrhome/</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
安装完成。
-
启动并关闭tomcat:
/usr/local/solr/tomcat/bin/startup.sh
3. 测试访问
http://ip:8080/solr/
简单使用
高亮显示结果:
二、配置中文分词器 IK Analyzer 2012FF_hf1
在solr中,每一个记录需要一个都需要id
定义我们自己的搜索字段:id、title、price、category_name等
配置 IK Analyzer 2012FF_hf1
- 复制 jar 包 到solr的lib下
cd IK\ Analyzer\ 2012FF_hf1 cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
- 复制 ext_stopword.dic、IKAnalyzer.cfg.xml、mydict.dic 到 classpath(即classes)下
mkdir /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes cp ext_stopword.dic IKAnalyzer.cfg.xml mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes/
- 在solrhome下的collection1/conf/schema.xml定义 业务域(collection1)
本身已经指定了一些分词器:vim /usr/local/solr/solrhome/collection1/conf/schema.xml
添加以下内容到最后:<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <field name="item_title" type="text_ik" indexed="true" stored="true"/> <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/> <field name="item_price" type="long" indexed="true" stored="true"/> <field name="item_image" type="string" indexed="false" stored="true" /> <field name="item_category_name" type="string" indexed="true" stored="true" /> <field name="item_desc" type="text_ik" indexed="true" stored="false" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_title" dest="item_keywords"/> <copyField source="item_sell_point" dest="item_keywords"/> <copyField source="item_category_name" dest="item_keywords"/> <copyField source="item_desc" dest="item_keywords"/>
- 只有 solr.TextField 这个类型可以指定分词器(自定义都使用这个)
- 设置 分词域名 为 text_ik
- item_category_name 不进行分词,
type="string"
相当于 StringField:不分词,只索引 - 需要分词:
type="text_ik"
- item_keywords: 复制域,复制下面的东西统一管理,索引时只需要搜索item_keywords即可
- 基本写法(按照这个模板写即可):
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <field name="text_ik" type="text_ik" indexed="true" stored="true" multiValued="false" />
- 只有 solr.TextField 这个类型可以指定分词器(自定义都使用这个)
重启tomcat,测试分词
三、SolrJ 简单使用
maven依赖:
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<solrj.version>4.10.3</solrj.version>
</dependency>
添加对象:
- 创建一个solrServer对象。创建HttpSolrServer对象,需要指定solr服务的url http://ip:8080/solr/collection1
- 创建一个文档对象 SolrInputDocumnet
- 向文档中添加域,域的名称必须在schema.xml中定义(已定义),且必须有id域
- 把文档对象写入索引库
- 提交
Solr查询:
- 创建一个SolrServer对象
- 创建SolrQuery对象
- 设置查询条件、过滤条件、分页条件、排序条件、高亮条件
- 执行查询,得到一个Response对象
- 获取查询结果、取查询结果总记录数
- 分析所有的查询结果,对单条记录进行处理
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
public class TestSolrJ {
private String url = "http://192.168.25.131:8080/solr/collection1";
@Test
public void addDocument() throws Exception{
// 1. 创建一个solrServer对象。创建HttpSolrServer对象,需要指定solr服务的url http://192.168.25.136:8080/solr/collection1
SolrServer solrServer = new HttpSolrServer(url);
// 2. 创建一个文档对象 SolrInputDocumnet
SolrInputDocument solrInputDocument = new SolrInputDocument();
// 3. 向文档中添加域,域的名称必须在schema.xml中定义(已定义),且必须有id域
solrInputDocument.addField("id", "test001");
solrInputDocument.addField("item_title", "测试标题");
solrInputDocument.addField("item_price", 1003);
// 4. 把文档对象写入索引库
solrServer.add(solrInputDocument);
// 5. 提交
solrServer.commit();
}
@Test
public void deleteDocumentById() throws Exception{
SolrServer server = new HttpSolrServer(url);
server.deleteById("test001");
server.commit();
}
@Test
public void deleteDocumentByQuery() throws Exception{
SolrServer server = new HttpSolrServer(url);
server.deleteByQuery("id:test001");
server.commit();
}
@Test
public void searchDocument() throws Exception{
// 1. 创建一个SolrServer对象
SolrServer server = new HttpSolrServer(url);
// 2. 创建SolrQuery对象
SolrQuery solrQuery = new SolrQuery();
// 3. 设置查询条件、过滤条件、分页条件、排序条件、高亮条件//solrQuery.setQuery("*:*"); = solrQuery.set("q", "*:*");//q=查询条件
// solrQuery.set("q", "*:*");
// solrQuery.setQuery("*:*");//查询所有
solrQuery.setQuery("手机");
solrQuery.setStart(0);//从第一条开始
solrQuery.setRows(2);//每页20条
solrQuery.setHighlight(true);//设置高亮
solrQuery.addHighlightField("item_title");// 设置高亮显示的域
solrQuery.setHighlightSimplePre("<em>");// 设置高亮显示的域。<em>用<div>也行
solrQuery.setHighlightSimplePost("</em>");// 设置高亮显示的域
solrQuery.set("df","item_keywords");// 设置默认搜索域
// 4. 执行查询,得到一个Response对象
QueryResponse response = server.query(solrQuery);
// 5. 获取查询结果
SolrDocumentList solrDocumentList = response.getResults();
// 取查询结果总记录数
System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
// 6. 分析所有的查询结果,对单条记录进行处理
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
// 取itemTitle里面的 高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String itemTitle = (String) solrDocument.get("item_title");
if (list != null && list.size()>0) {
itemTitle = list.get(0);
}
System.out.println(itemTitle);
System.out.println(solrDocument.get("item_sell_point"));
System.out.println(solrDocument.get("item_price"));
System.out.println(solrDocument.get("item_image"));
System.out.println(solrDocument.get("item_category_name"));
System.out.println(solrDocument.get("item_desc"));
System.out.println("===============================================");
}
}
}
若有不正之处,请谅解和批评指正,谢谢~
转载请标明:
https://blog.csdn.net/vihem/article/details/121332502