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&amp;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实现搜索引擎的主要内容,如果未能解决你的问题,请参考以下文章

Sitecore8.2 .net Solr搜索实现

08.Solr简介

solr引擎的学习

Solr简介和使用(一期)

初识Solr,基于Lucene的全文搜索服务器

利用solr实现商品的搜索功能