前言:
现时各位老铁们对“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安装