龙空技术网

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

程序猿洞穴 1391

前言:

现时各位老铁们对“apachesolr安装”大致比较看重,小伙伴们都需要了解一些“apachesolr安装”的相关资讯。那么小编也在网上收集了一些对于“apachesolr安装””的相关资讯,希望姐妹们能喜欢,咱们一起来了解一下吧!

使用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:

ik-analyzer-5.3.0:

安装:

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后台了

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管理后台(),选择一个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=

核心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。

标签: #apachesolr安装