Solr

solr是什么?

Solr是基于Lucene的,Lucene 支持强大的匹配能力,如短语,通配符,连接,分组和更多不同的数据类型。

为什么要solr?

  • solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品);
  • solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载;
  • solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制;
  • solr支持分布式集群,索引服务的容量和能力可以线性扩展。

SolrHome是Solr运行的主目录,目录中包括了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore,一个SolrHome可以包括多个SolrCore(Solr实例),每个SolrCore提供单独的搜索和索引服务。

1、Windows(Solr)

下载zip包:http://archive.apache.org/dist/lucene/solr

  1. src.tgz:带src表示是带源码文件的压缩包,无src是已经编译过的压缩包
  2. tgz:Linux相关操作系统使用的压缩包
  3. zip:Windows操作系统使用的压缩包

解压zip压缩包,目录如下:

找到start.jar文件将其放入example目录下(网上说解压后example目录下有start.jar文件的,我的没有,就把server目录下的start.jar复制了一份放进去)

1.1 启动

接下来就是要启动solr服务了,使用win+r快捷键打开“运行”窗口-》输入“cmd”-》进入到“dos”窗口-》进入放solr的bin目录下

solr的启动、停止、查看命令:
1. 启动:solr.cmd start
2. 停止:solr.cmd stop 或bin\solr.cmd stop -all
3. 查看:solr.cmd status

启动之后就可以打开浏览器输入地址http://localhost:8983/solr/#/来查看solr的管理控制台了。如图:

1.2 添加solr collection

 先进入example/example-DIH/solr/solr目录中将该目录中的conf文件夹与core.properties文件copy到server/solr目录创建一个文件夹collection下

 

接下来重启:solr restart

刷新页面http://localhost:8983/solr/#/

1.3 配置中文分词器 IK-Analyzer-Solr7

先下载solr7版本的ik分词器,下载地址:http://search.maven.org/#search%7Cga%7C1%7Ccom.github.magese

将下载好的jar包放入/server/solr-webapp/webapp/WEB-INF/lib目录中

然后到/server/solr/collection/conf目录中打开managed-schema文件

在配置文件中加入以下代码:

<!-- ik分词器 -->

<fieldType name="text_ik" class="solr.TextField">

  <analyzer type="index">

      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>

      <filter class="solr.LowerCaseFilterFactory"/>

  </analyzer>

  <analyzer type="query">

      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>

      <filter class="solr.LowerCaseFilterFactory"/>

  </analyzer>

</fieldType>

配置完成后再次重启一次solr服务solr restart -p 9090

再次刷新http://localhost:9090/solr/index.html页面

选择collection-> Analysis -> 选择分词器 text_ik 输入 "我是中国人"

 点击"Analyse Values"按钮可以看到结果已经分词成功了。

2、Linux(Solr 单机)

2.1 Apache -Tomcat服务器

解压到 Solr目录下

tar –zxvf apache-tomcat-7.0.47.tar.gz –C /solr

2.2 Solr

解压到 Solr目录下

tar –zxvf solr-4.10.3.tar –C /solr

2.3 IK分词器

首先创建 一个 分词器目录

mkdir /solr/IK

解压到Solr目录下

unzip IKAnalyzer2012FF_hf1.zip  -d /solr/IK

2.4 Solr部署到Tomcat

Solr目录只使用到一个重要目录

进入 example

Ext目录 下JAR包 拷贝到 Tomcat/lib 目录下

Webapps目录下 solr.war包拷贝到 Tomat/webapps 目录下

进入Tomat/webapps 目录下 创建 一个solr文件夹

把solr.war包解压到 solr文件夹中

unzip solr.war -d solr

删除solr.war

rm -rf solr.war

配置solr目录下 web.xml 索引库的位置

 vim web.xml

 :set nu 显示行号

 

启动 Tomcat服务器

sh bin/startup.sh

开启Tomcat日志

tail -f /solr/apache-tomcat-7.0.47/logs/catalina.out

访问 主机+端口+solr

http://192.168.48.101:8080/solr

2.5 IK分词器+Solr

  1. 复制IK.cfg.xml 到项目的classes下  
  2. 复制IK的Jar包到/webapp/solr/WEB_INF/lib下
  3. 复制stop.dic停词到项目的classes下

修改Solr仓库 collection1/conf/schema.xml

修改Solr的schema.xml文件,添加FieldType:

<!-- IKAnalyzer-->

     <fieldType name="text_ik" class="solr.TextField">

<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>

<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>

 </fieldType>

自定义域

<!--IKAnalyzer Field-->

   <field name="name_ik" type="text_ik" indexed="true" stored="true" />

<field name="brandId" type="int" indexed="true" stored="true" />

启动Tomcat服务器 ,查看自定义 域类型 以及域

2.6 扩展IK分词器

增加停用词

进入 solr/WEB-INF/classes/stopword.dic中

vi stopword.dic

增加扩展分词器

进入solr/WEB-INF/classes/IKAnalyzer.cfg.xml中

打开扩展词典

创建扩展词典 文档

touch ext.dic

进入 solr/WEB-INF/classes/ext.dic中

再次启动Tomcat测试

3、SolrJ 测试使用

配置文件新增几个字段:

也可以用页面控制台添加:

3.1 先加入maven依赖

<dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>4.10.2</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
</dependency>

3.2.1 向索引库中添加

/*
     * 测试向索引库中添加文档
     */
    @Test
    public void testSave() throws Exception{
        //1.创建连接对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");
        //2.创建一个文档对象
        SolrInputDocument inputDocument = new SolrInputDocument();
        //向文档中添加域以及对应的值,注意:所有的域必须在schema.xml中定义过,前面已经给出过我定义的域。
        inputDocument.addField("id", "1");
        inputDocument.addField("item_title", "夏普爆炸牌手机");
        inputDocument.addField("item_price", 666);
        inputDocument.addField("item_image", "www.boom.png");
        //3.将文档写入索引库中
        solrServer.add(inputDocument);
        //提交
        solrServer.commit();
    }

3.2.2 修改

/*
     * 修改
     */
    @Test
    public void testUpdate() throws Exception{
        //1.创建连接对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");
        //2.创建一个文档对象
        SolrInputDocument inputDocument = new SolrInputDocument();
        inputDocument.addField("id", "1");
        //修改id为1的商品的信息(如果该商品不存在其实就是添加了)
        inputDocument.addField("item_title", "vivo手机hahaha");
        inputDocument.addField("item_price", 6666);
        inputDocument.addField("item_image", "www.123.png");
        //3.将文档写入索引库中
        solrServer.add(inputDocument);
        //提交
        solrServer.commit();
    }

3.2.3 根据id删除文档

 /*
     * 测试删除文档:根据id删除文档 *
     */
    @Test
    public void testDeleteById() throws Exception{
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");
        //删除文档
        solrServer.deleteById("1");
        //提交
        solrServer.commit();
    }
    

3.2.4 查询单个商品信息

/*
     * 简单查询:查询单个商品信息
     */
    @Test
    public void testSimpleQ() throws Exception{
        //1.创建连接
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");
        //2.创建查询语句
        SolrQuery query = new SolrQuery();
        //3.设置查询条件
        query.set("q", "id:1");
        //4.执行查询
        QueryResponse queryResponse = solrServer.query(query);
        //5.取文档列表public class SolrDocumentList extends ArrayList<SolrDocument>
        SolrDocumentList documentList = queryResponse.getResults();
        for (SolrDocument solrDocument : documentList) {
            //取各个文档信息
            System.out.println("商品id:"+solrDocument.get("id")+" ");
            System.out.println("商品标题:"+solrDocument.get("item_title")+" ");
            System.out.println("商品价格:"+solrDocument.get("item_price")+" ");
            System.out.println("商品图片:"+solrDocument.get("item_image")+" ");
        }
    }

3.2.5 设置条件进行查询

/**
     * 设置条件进行查询
     */
    @Test
    public void testSimpleQ2 () throws Exception{
        //1.创建连接
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");
        //2.创建查询语句
        SolrQuery query = new SolrQuery();
        //3.设置查询条件
        query.set("q", "夏普");//设置查询关键字
        query.setSort("id", ORDER.desc);//按照id降序排列
        query.setStart(0);
        query.setRows(2);//分页条件
        query.set("df", "item_title");//默认在商品标题域进行查询
        //4、执行查询
        QueryResponse queryResponse = solrServer.query(query);
        //5.获取文档列表
        SolrDocumentList documentList = queryResponse.getResults();
        //获取总记录数
        long numFound = documentList.getNumFound();
        System.out.println("总记录数:" + numFound);
        for (SolrDocument solrDocument : documentList) {
            //取各个文档信息
            System.out.print("商品id:"+solrDocument.get("id")+" ");
            System.out.print("商品标题:"+solrDocument.get("item_title")+" ");
            System.out.print("商品价格:"+solrDocument.get("item_price")+" ");
            System.out.println();
        }
    }

3.2.6 带高亮的复杂查询

/**
     * 带高亮的复杂查询
     */
    @Test
    public void testSimpleQuery() throws IOException, SolrServerException {
        SolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr/collection");

        SolrQuery solrQuery = new SolrQuery();
        solrQuery.set("q","手机");
        solrQuery.set("df","item_title");//df=>default field
        solrQuery.setSort("id", SolrQuery.ORDER.asc);

//        solrQuery.setStart(2);
//        solrQuery.setRows(2);

        //开启高亮显示
        solrQuery.setHighlight(true);
        solrQuery.addHighlightField("item_title");
        solrQuery.setHighlightSimplePre("<em style='color:red'>");
        solrQuery.setHighlightSimplePost("</em>");

        QueryResponse queryResponse = solrServer.query(solrQuery);
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        Map<String, Map<String, List<String>>> mapMapHighlighting = queryResponse.getHighlighting();

        for(SolrDocument solrDocument : solrDocumentList)
        {
            String id = (String)solrDocument.get("id");

            Map<String, List<String>> map = mapMapHighlighting.get(id);//一个商品,一个json对象
            
            for(Map.Entry<String, List<String>> entry : map.entrySet())
            {
                System.out.print(entry.getKey() +":"+ entry.getValue().get(0));
                System.out.println();
            }
            System.out.println("----------------");
        }

    }

导包如下:

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值