基于Apache Solr搭建全文搜索服务器

发布时间:2018-01-10 16:45:56编辑:丝画阁阅读(432)

基于Apache Solr搭建全文搜索服务器

使用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,配置如下:


然后将字段的类型设置为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数据失败!");

}

}

【注意事项】

  1. 修改schema文件后不仅要重启Solr,还要重新导入数据才能生效。

  2. 要想在Solr查询语法中使用特定字段过滤查询结果,就要将该字段schema的indexd和stored都设置为true。

关键字