网站首页 > 开源技术 正文
使用Solr从无到有搭建一个全文搜索服务器可分为三大部分,第一是安装和配置Solr;第二是从数据库导入数据;第三是搭建搜索服务器,提供搜索接口。
第一部分:【 安装和配置Solr】
我测试用的服务器为阿里云服务器,操作系统为Ubuntu 16.04 64位,Jdk版本为1.8(Solr依赖java环境)
1. 下载安装Solr以及IK中文分词器插件(Solr自带的中文分词器根本不懂中文)
版本:solr-5.2.1、ik-analyzer-5.3.0
下载地址:
solr-5.2.1:http://image.jthinking.com/software/solr-5.2.1.tgz
ik-analyzer-5.3.0:http://image.jthinking.com/software/ik-analyzer-5.3.0.zip
安装:
Solr解压即可,ik分词器其实就是一个jar包和三个配置文件
2. 运行Solr(Solr其实就是基于Lucene开发的一个Web项目)
运行前注意检查是否配置了JAVA_HOME环境变量
进入Solr的bin目录
cd solr-5.2.1/bin
启动solr(注意必须先启动一次,再配置中文分词等。这样内部才会部署war包到指定目录并解压,才会出现我们待会儿要操作的目录)
./solr start
分别在操作系统和阿里云安全组开放Solr默认端口8983
此时我们就可以访问solr后台了
http://192.168.1.105:8983/solr/
3. 配置中文分词器
将ik-analyzer-5.3.0.jar复制到solr-5.5.4/server/solr-webapp/webapp/WEB-INF/lib 目录下,将IKAnalyzer.cfg.xml、ext.dic、stopword.dic复制到solr-5.5.4/server/solr-webapp/webapp/WEB-INF/classes目录下。
使用分词器时只需要在Core的schema.xml中配置一个fieldType,配置如下:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
然后将字段的类型设置为text_ik,这时此字段就支持中文分词了。
4. 新增自己的Core(Core相当于一个搜索接口,一条SQL查询,或者是前台的一个搜索框,一个Solr服务器就是由很多Core组成的)
Core本应该可以在Solr的管理后台进行添加,但是在添加之前必须手动创建目录。
进入目录
cd solr-5.2.1/server/solr
新建目录(core的名字是article)
mkdir article
mkdir article/conf
mkdir article/data
接下来就是最关键的,添加Core所需配置文件和jar包。
每个Core都有自己独立的两个核心配置文件schema.xml和solrconfig.xml,将它们放到每个Core下的conf目录下。
[schema.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="product" version="1.5">
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<field name="ProductId" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="ProductName" type="text_ik" indexed="true" stored="true"/>
<field name="LowestSalePrice" type="string" indexed="true" stored="true"/>
<field name="ImageUrl" type="string" indexed="false" stored="true"/>
<field name="pluteformid" type="string" indexed="false" stored="true"/>
<field name="shopId" type="long" indexed="false" stored="true"/>
<field name="text" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="ProductName" dest="text"/>
<copyField source="LowestSalePrice" dest="text"/>
<uniqueKey>ProductId</uniqueKey>
<types>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
</types>
</schema>
[solrconfig.xml ](直接复制例子Core的配置文件,加上数据导入的配置)
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">dih-config.xml</str>
</lst>
</requestHandler>
另外,每个Core的conf目录下还需要三个html文件admin-extra.html、admin-extra.menu-bottom.html、admin-extra.menu-top.html(这三个html文件直接到例子Core中复制),另外还有支持数据库导入的dih-config.xml。
[dih-config.xml]
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/product"
user="root"
password="root"
batchSize="100"
autoCommit="false" />
<document name="product">
<entity name="product" pk="ProductId"
query=SELECT id,title,sell_point,price,num,barcode,image,cid,status,created,updated FROM tb_item"
deltaQuery="SELECT id,title,sell_point,price,num,barcode,image,cid,status,created,updated FROM tb_item WHERE updated > '${dataimporter.last_index_time}'"
transformer="RegexTransformer">
</entity>
</document>
</dataConfig>
配置完成后到Solr Web管理后台Core Admin-->Add Core,按要求新建,注意所填选项要与刚刚新建的名称对应。
第二部分:【从数据库导入数据】
访问Solr Web管理后台(http://192.168.1.105:8983/solr/),选择一个Core,点击Dataimport选项,点击Execute导入数据。
第三部分:【搭建搜索服务器】
使用Solrj+SpringMVC创建搜索接口
spring核心配置文件
[ applicationContext-solrj.xml ]
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg index="0" value="${SOLR.URL}"/>
<!-- 设置响应解析器,solrj没有提供json解析器,所以通常用xml解析器 -->
<property name="parser">
<bean class="org.apache.solr.client.solrj.impl.XMLResponseParser"/>
</property>
<!-- 设置重试次数,推荐设置为1 -->
<property name="maxRetries" value="1"/>
<!-- 建立连接的最长时间 ,单位是:毫秒-->
<property name="connectionTimeout" value="500"/>
</bean>
</beans>
[solr.properties]
SOLR.URL=http://192.168.1.105:8983/solr/product
核心Service
[SearchService.java]
package com.jthinking.search.service;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jthinking.search.pojo.ProductResult;
import com.jthinking.search.pojo.SysResult;
@Service
public class SearchService {
@Autowired
private HttpSolrServer httpSolrServer;
public SysResult search(String keyWords, Integer page, Integer rows) {
//构造搜索对象
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(keyWords);
// 分页数据
solrQuery.setStart((Math.max(1, page) - 1) * rows);
solrQuery.setRows(rows);
// 设置高亮显示
solrQuery.setHighlight(true);// 开启高亮
solrQuery.setHighlightSimplePre("<span class=\"red\">");
solrQuery.setHighlightSimplePost("</span>");
solrQuery.addHighlightField("ProductName");
try {
QueryResponse queryResponse = this.httpSolrServer.query(solrQuery);
List<ProductResult> items = queryResponse.getBeans(ProductResult.class);
if (items == null || items.isEmpty()) {
return SysResult.build(200, "没有搜索到数据!");
}
// 将高亮的标题数据写回到数据对象中
Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting();
for (Map.Entry<String, Map<String, List<String>>> highlighting : map.entrySet()) {
for (ProductResult item : items) {
if (!highlighting.getKey().equals(item.getProductId().toString())) {
continue;
}
item.setProductName(StringUtils.join(highlighting.getValue().get("ProductName"), ""));
break;
}
}
return SysResult.build(200, String.valueOf(queryResponse.getResults().getNumFound()), items);
} catch (Exception e) {
e.printStackTrace();
}
return SysResult.build(201, "搜索错误!");
}
/**
* 更新solr中数据
* @param item
* @return
*/
public SysResult update(ProductResult item) {
try {
this.httpSolrServer.addBean(item);
this.httpSolrServer.commit();
return SysResult.ok();
} catch (Exception e) {
e.printStackTrace();
}
return SysResult.build(201, "更新solr数据失败!");
}
}
【注意事项】
修改schema文件后不仅要重启Solr,还要重新导入数据才能生效。
要想在Solr查询语法中使用特定字段过滤查询结果,就要将该字段schema的indexd和stored都设置为true。
猜你喜欢
- 2024-10-23 ES 基本知识(es基本介绍)
- 2024-10-23 maven打包jar包时如何打包本地jar文件
- 2024-10-23 记录自己搭建solr配置中文分词的过程供大家参考
- 2024-10-23 springboot整合websocket、solr(springboot整合rocketMQ)
- 2024-10-23 ElasticSearch安装ik分词插件(elasticsearch 安装ik分词器)
- 2024-10-23 12K的码农怎样蜕变为30k的架构师?找准方向,拒绝迷茫
- 2024-10-23 Lucene就是这么简单(好儿子今天妈妈就是你的女人了)
- 2024-10-23 5分钟带你了解Lucene全文索引(lucene索引原理)
- 2024-10-23 在.net core中进行中文分词方法(.net core hangfire)
- 2024-10-23 Elasticsearch-通过外网访问加入kibana,head「002」
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)