发布时间:2018-01-10 16:45:56编辑:丝画阁阅读(1137)
使用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,配置如下:
然后将字段的类型设置为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]
ProductId
[solrconfig.xml ](直接复制例子Core的配置文件,加上数据导入的配置)
dih-config.xml
另外,每个Core的conf目录下还需要三个html文件admin-extra.html、admin-extra.menu-bottom.html、admin-extra.menu-top.html(这三个html文件直接到例子Core中复制),另外还有支持数据库导入的dih-config.xml。
[dih-config.xml]
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/product"
user="root"
password="root"
batchSize="100"
autoCommit="false" />
query=SELE CT id,title,sell_point,price,num,barcode,image,cid,status,created,updated FROM tb_item"
deltaQuery="SELE CT id,title,sell_point,price,num,barcode,image,cid,status,created,updated FROM tb_item WHERE updated > '${dataimporter.last_index_time}'"
transformer="RegexTransformer">
配置完成后到Solr Web管理后台Core Admin-->Add Core,按要求新建,注意所填选项要与刚刚新建的名称对应。
访问Solr Web管理后台(http://192.168.1.105:8983/solr/),选择一个Core,点击Dataimport选项,点击Execute导入数据。
使用Solrj+SpringMVC创建搜索接口
spring核心配置文件
[ applicationContext-solrj.xml ]
[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("");
solrQuery.setHighlightSimplePost("");
solrQuery.addHighlightField("ProductName");
try {
QueryResponse queryResponse = this.httpSolrServer.query(solrQuery);
Listitems = queryResponse.getBeans(ProductResult.class);
if (items == null || items.isEmpty()) {
return SysResult.build(200, "没有搜索到数据!");
}
// 将高亮的标题数据写回到数据对象中
Map>> map = queryResponse.getHighlighting();
for (Map.Entry>> 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。
关键字:
本站部分内容来源网络及网友上传,本站未必能一一鉴别其是否为公共版权或其版权归属,如果您认为侵犯您的权利,本站将表示非常抱歉!
请您速联系本站,本站一经核实,立即删除。删文删帖联系【2789291421@qq.com】