Solr基于Lucene实现搜索引擎
Posted 小鹿的技术杂谈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr基于Lucene实现搜索引擎相关的知识,希望对你有一定的参考价值。
Solr概述
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过HTTP Get操作提出查找请求,并得到XML格式的返回结果。
Solr是一个高性能的,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Solr环境搭建
安装Tomcat
//解压缩Tomcat
tar –zxvf apache-tomcat-8.5.27.tar.gz
//进入Tomcat目录
cd apache-tomcat-8.5.27
//启动Tomcat
./bin/startup.sh
//关闭防火墙
servcie iptables stop
chkconfig iptables off
安装Solr
//解压缩Solr
tar -zxvf solr-7.3.0.tgz
复制 solr\server\solr-webapp\webapp 到 Tomcat\webapps\
文件夹改名为 solr
复制 solr\server\lib\ext 中的 jar 到 Tomcat\webapps\solr\WEB-INF\lib 目录中
复制 solr\server\lib 中的 jar 到 Tomcat\webapps\solr\WEB-INF\lib 目录中
复制 solr\dist 中的 jar 到 Tomcat\webapps\solr\WEB-INF\lib 目录中
复制 solr\server\resources\log4j.properties 到 Tomcat\webapps\solr\WEB-INF\classes 目录
配置Solr实例
在 Tomcat 目录下建立 solrhome 目录(存放Solr实例) 在solrhome目录下创建 bwf 目录 (具体的一个Solr实例)
复制 solr\example\example-DIH\solr\solr\ 所有文件 到 Tomcat/solrhome/bwf 目录
复制 solr/server/solr/ 所有文件 到 Tomcat/solrhome 目录
编辑 Apache/webapps/solr/WEB-INF/web.xml
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/apache-tomcat-8.5.27/solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> |
注释掉 <security-constraint>
测试运行Solr服务器
启动Tomcat服务器
通过浏览器访问:http://172.31.78.87:8080/solr/index.html
配置Solr中文分词器
复制 solr/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5.0.jar 到 Tomcat/webapps/solr/WEB-INF/lib/
编辑 bwf/conf/managed-schema:
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0"> <analyzer type="index"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> </analyzer> </fieldType> |
配置IK中文分词器
复制 IKAnalyzer.cfg.xml , ext.dic和stopword.dic 到 Tomcat/webapps/solr/WEB-INF/classes 目录下
ext.dic 里扩展中文分词如:博为峰
复制 IKAnalyzer2017_6_6_0.jar 到 Tomcat/webapps/solr/WEB-INF/lib/目录
编辑 bwf/conf/managed-schema:
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> </analyzer> </fieldType> |
配置拼音分词器
复制 pinyin4j-2.5.0.jar、pinyinAnalyzer.jar 到 Tomcat/webapps/solr/WEB-INF/lib/目录
编辑 bwf/conf/managed-schema:
<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" /> <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="6" maxGram="20" /> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" /> <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="6" maxGram="20" /> </analyzer> </fieldType> |
数据导入
managed-schema.xml配置索引字段:
<!-- 索引字段 --> <field name="prodSn" type="text_ik" indexed="true" stored="true" /> <field name="prodName" type="text_pinyin" indexed="true" stored="true" /> <field name="prodImage" type="text_ik" indexed="true" stored="true" /> <field name="prodPrice" type="pdouble" indexed="true" stored="true" /> <field name="prodStock" type="pint" indexed="true" stored="true" /> <field name="prodSale" type="pint" indexed="true" stored="true" /> <field name="prodContent" type="text_pinyin" indexed="true" stored="true" /> <field name="categoryId" type="pint" indexed="true" stored="true" /> <field name="prodOrder" type="pint" indexed="true" stored="true" /> <field name="isPush" type="pint" indexed="true" stored="true" /> <field name="prodStatus" type="pint" indexed="true" stored="true" /> <!-- 索引关键字段(合并索引字段) --> <field name="prod_keywords" type="text_pinyin" indexed="true" stored="true" multiValued="true" /> <copyField source="prodName" dest="prod_keywords" /> <copyField source="prodContent" dest="prod_keywords" /> |
solr-data-config.xml配置数据源:
<!-- 数据库信息 --> <dataSource name="jdbc" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://172.31.79.174:3306/bwfshop?useUnicode=true&characterEncoding=utf8" user="root" password="" batchSize="-1" netTimeoutForStreamingResults="10"/> <document> <entity dataSource="jdbc" name="product" transformer="ClobTransformer" query="select * from product"> <field column="prodId" name="id" /> <field column="prodSN" name="prodSN" /> <field column="prodName" name="prodName" /> <field column="prodImage" name="prodImage" /> <field column="prodPrice" name="prodPrice" /> <field column="prodStock" name="prodStock" /> <field column="prodSale" name="prodSale" /> <field column="prodContent" name="prodContent" /> <field column="categoryId" name="categoryId" /> <field column="prodOrder" name="prodOrder" /> <field column="isPush" name="isPush" /> <field column="prodStatus" name="prodStatus" /> </entity> </document> |
复制 mysql-connector-java-5.1.30.jar 到 Tomcat/webapps/solr/WEB-INF/lib/目录
重启 Tomcat
通过浏览器访问:http://172.31.78.87:8080/solr/index.html
SSM整合Solr
添加POM依赖
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.3.0</version> </dependency> |
实体对象索引映射
public class Product implements Serializable { @Field("id") private String prodId; @Field private String prodSn; …… } |
SolrClient使用
String baseUrl = "http://172.31.79.19:8080/solr/bwf"; // 创建SolrClient操作对象 HttpSolrClient solrClient= new HttpSolrClient.Builder(baseUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); |
SolrClient添加/修改索引
// 准备要添加的实体对象 Product prod = new Product(); prod.setProdId("100001"); prod.setProdName("测试商品1"); // 创建索引 solrClient.addBean(prod); // 提交事务 solrClient.commit(); |
SolrClient删除索引
// 根据Id删除索引 solrClient.deleteById("100001"); // 提交事务 solrClient.commit(); |
SolrClient搜索索引
// 准备搜索语句 SolrQuery query = new SolrQuery("prod_keywords:boweifeng"); // 为搜索添加索引字段 query.addField("id"); query.addField("prodName"); query.addField("prodContent"); query.setRows(100); // 发送查询 QueryResponse response = solrClient.query(query); solrClient.commit(); // 查询结果转换实体对象 List<Product> list = response.getBeans( Product.class ); // 显示搜索结果 for( Product p : list ) { System.out.println(p.getProdId()+"\t"+p.getProdName()+"\t"+p.getProdContent()); } |
SSM整合Solr
添加spring-solr.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd" xmlns:util="http://www.springframework.org/schema/util" > <bean class="org.apache.solr.client.solrj.impl.HttpSolrClient" id="httpSolrClient"> <constructor-arg name="builder" value="http://172.31.78.87:8080/solr/bwf"> </constructor-arg> </bean> </beans> |
以上是关于Solr基于Lucene实现搜索引擎的主要内容,如果未能解决你的问题,请参考以下文章