solr

目标:

solr的概念

solr服务器的搭建和使用

solr中导入数据库数据

项目中怎么使用solr实现商品搜索功能

一.solr相关概念

1.1 什么是Solr?

solr是一个独立的企业级搜索应用服务器,它是对外提供类似于web-service的api接口,用户可以通过http请求,发送一定格式的xml数据到solr,生成索引,也可以发送http get请求,请求solr服务器查询数据,将查询出的数据也是以xml格式返回.

1.2.为什么要用solr?

1.数据库的模糊查询没有分词的功能,solr有,可以更有效的查询到我们需要的数据

2.从solr 服务器中查询数据会比从数据库查询速度要快.

1.3.solr的工作方式

文档通过Http利用XML 加到一个搜索集合中。Solr查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

1.4. solr特点

1.高级全文搜索能力:由Lucene 提供支持,Solr可实现强大的匹配功能,包括短语,通配符,联接,分组以及任何数据类型 .

2.拥有基于标准的开放式接口- XML、JSON 和 HTTP

3.综合的管理界面

4.高度的可扩展性和容错性

5.能够实时索引

6.可扩展的插件架构,Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。

1.5.solr版本和jdk需求关系

​ 版本 发布时间 说明

​ 1.1 2007-01-18 –

​ ….

​ 4.0.0 2013-01-16 Java 1.6 以上,ZooKeeper 3.3.6;引入solrcloud

​ ….

​ 4.7.1 2014-04-01 Java 1.6 以上,最后一个采用旧版配置方法版本

​ 4.8.0 2014-04-27 Java 1.7 以上,ZooKeeper 3.4.6

​ ….

​ 6.0.0 2016-04-07 Java 1.8 以上,Jetty 9.3.8

​ …..

1.6. Solr 相关链接

​ Solr 各版本下载地址:http://archive.apache.org/dist/lucene/solr/

​ Solr 官方网站:http://lucene.apache.org/solr/resources.html

​ 详细的solr中文手册链接:https://www.w3cschool.cn/solr_doc/

二.solr的安装

2.1 下载jar 7.6.0

2.2 解压

​ 解压出来的文件目录


2.3 启动服务器

2.4访问

输入: http://localhost:8983

三 创建core

在solr中,每一个core代表一个索引库,里面保存索引数据以及配置信息

solr中可以有多个core,也就相当于mysql服务器下可以多个数据库

3.1 方法1: 用命令创建

  1. solr create -c core名称
  2. core的存放路径

3.2 方法2:界面创建

​ 1.在solr-7.6.0/server/solr 文件夹下创建一个core文件夹 ,取名为students(商城项目里取名为goods)

  1. 将C:\solr-7.6.0\server\solr\configsets_default下的conf文件复制一份到students(或goods)文件夹下 3.在solr界面Add Core,(之前取名goods的 这里名字就为goods)

四. 添加中文分词

​ 选择刚才创建的core,点击Analysis进入分词分析页面,输入要分词的句子,选择分词库,点击分析按钮,即可看到分词结果

​ solr默认不支持中文分词

4.1测试自带的中文分词(商城项目配置 跳过这一步 直接用后面的ik分词器)

4.1.1 添加中文分词插件

​ solr 7.6中自带中文分词插件,将solr-7.6.0\contrib\analysis-extras\lucene-libs\lucene-analyzers-smartcn-7.6.0.jar 复制到 solr-7.6.0\server\solr-webapp\webapp\WEB-INF\lib 目录中

4.1.2配置中文分词

修改 solr-7.6.0\server\solr\articles【创建的core的名称】\conf\managed-schema文件

添加我们的中文配置【在eclipse/idea等工具里打开,记事本打开容易出现编码问题】

 <!-- Chinese -->
<fieldtype name="text_cn" class="solr.TextField" positionincrementgap="100">

   <analyzer type="index">
      <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory">
   </tokenizer></analyzer>

   <analyzer type="query">
      <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory">
   </tokenizer></analyzer>

</fieldtype>

4.1.3重启solr,测试中文分词

​ solr restart -p 8983

4.2 测试中文分词起ik-analyzer

4.2.1 下载ik-analyzer-7.6.0.jar包

​ 并添加到solr-7.6.0\server\solr-webapp\webapp\WEB-INF\lib 目录中

4.2.2 在创建的core里的配置文件managed-schema.xml中添加

<!-- 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">
  </filter></tokenizer></analyzer>
  <analyzer type="query">
     <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" usesmart="true" conf="ik.conf">
     <filter class="solr.LowerCaseFilterFactory">
  </filter></tokenizer></analyzer>
</fieldtype>

4.2.3 重启服务器, 测试

solr restart -p 8983

五.导入数据库中数据

  1. 将数据库jar包(在发你们的solr资料文件里)

solr

​ 和solr-7.6.0\dist下的dataimporthandler-7.6.0架包 (注意是mysql驱动和dataimport两个jar包)复制到 C:\solr-7.6.0\server\solr-webapp\webapp\WEB-INF\lib

solr
  1. 创建data-config.xml文件

​ goods/conf文件夹下创建mysql-db文件夹,然后在mysql-db文件夹中创建data-config.xml文件,文件中添加如下内容

<?xml version="1.0" encoding="utf-8" ?>
<dataconfig>
    <datasource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/sc" user="root" password="root">

    <document>
        <entity name="goods" query="select goods_id,goods_name,sales_price,goods_img,cid from goods">
               <field column="goods_id" name="id">
               <field column="goods_name" name="goodsName">
               <field column="sales_price" name="salesPrice">
               <field column="goods_img" name="goodsImg">
               <field column="cid" name="cid">
        </field></field></field></field></field></entity>

    </document>
</datasource></dataconfig>
  1. 添加document中的字段 在managed-schema.xml文件中添加


注意: id, version, root 不能删除

  &#x200B;         _text_ &#x4E0D;&#x9700;&#x8981; &#x53EF;&#x4EE5;&#x5220;&#x9664;

  
  <field name="id" type="string" indexed="true" stored="true" required="true" multivalued="false">
  <!-- docValues are enabled by default for long type so we don't need to index the version field  -->
  <field name="_version_" type="plong" indexed="false" stored="false">
  <field name="_root_" type="string" indexed="true" stored="false" docvalues="false">
  <field name="goodsName" type="text_ik" indexed="true" stored="true" multivalued="false">
  <field name="salesPrice" type="plong" indexed="true" stored="true" multivalued="false">
  <field name="goodsImg" type="string" indexed="true" stored="true" multivalued="false">
  <field name="cid" type="string" indexed="true" stored="true" multivalued="false">
  
</field></field></field></field></field></field></field>
  1. 导入data-config.xml文件 在solrconfig.xml文件中添加
<requesthandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">mysql-db/data-config.xml</str>
  </lst>
</requesthandler>
  1. 重启solr
  2. 导入数据 solr
  3. 测试查询 solr

六. ssm中使用solr

  1. 添加jar包
 <!-- solr jar包 -->
<dependency>
  <groupid>org.apache.solr</groupid>
  <artifactid>solr-solrj</artifactid>
  <version>7.6.0</version>
</dependency>
  1. 在spring.xml中配置
<!-- 配置solr客户端对象 -->
<bean id="httpSolrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
     <constructor-arg name="builder" value="http://localhost:8983/solr/goods">
</constructor-arg></bean>
  1. 修改pojo中goods类 solr
  2. 控制层写solr查询操作
@RequestMapping("showGoodsByWhere2")
    public String search2(@RequestParam(name = "pageIndex",defaultValue = "1") int pageIndex, int cid,@RequestParam(name = "keyword",defaultValue = "&#x897F;") String keyword) throws IOException, SolrServerException {
        //&#x521B;&#x5EFA;&#x4E00;&#x4E2A;query&#x5BF9;&#x8C61;
        SolrQuery solrQuery=new SolrQuery();
        //&#x8BBE;&#x7F6E;&#x9ED8;&#x8BA4;&#x7684;&#x67E5;&#x8BE2;&#x8303;&#x56F4;
        solrQuery.set("df", "goodsName");
        //&#x8BBE;&#x7F6E;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;
        solrQuery.setQuery(keyword+"*");
        //&#x8BBE;&#x7F6E;&#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
        solrQuery.setFilterQueries("cid:"+cid);
        //&#x8BBE;&#x7F6E;&#x6392;&#x5E8F;&#x6761;&#x4EF6;
        solrQuery.setSort("goodsPrice",ORDER.desc);

        solrQuery.addField("id");
        solrQuery.addField("goodsName");
        solrQuery.addField("salesPrice");
        solrQuery.addField("goodsImg");
        //solrQuery.addField("cid");
        solrQuery.setStart(0);
        //&#x6BCF;&#x9875;&#x663E;&#x793A;&#x591A;&#x5C11;&#x884C;
        solrQuery.setRows(2);
        //&#x8BBE;&#x7F6E;&#x9AD8;&#x4EAE;(&#x5F00;&#x542F;)
        solrQuery.setHighlight(true);
        //&#x8BBE;&#x7F6E;&#x9AD8;&#x4EAE;&#x57DF;
        solrQuery.addHighlightField("goodsName");
        //&#x8BBE;&#x7F6E;&#x9AD8;&#x4EAE;&#x524D;&#x7F00;
        solrQuery.setHighlightSimplePre("<em>");
        //&#x8BBE;&#x7F6E;&#x9AD8;&#x4EAE;&#x540E;&#x7F00;
        solrQuery.setHighlightSimplePost("</em>");

        // &#x521B;&#x5EFA;&#x7EC4;&#x5408;&#x6761;&#x4EF6;&#x4E32;
       // StringBuilder params = new StringBuilder("cid:" + cid);
       // params.append(" and goodsName:"+keyword);
       // solrQuery.setQuery(params.toString());

        //&#x5C06;&#x67E5;&#x8BE2;&#x5BF9;&#x8C61;&#x4F20;&#x9012;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7AEF;
        QueryResponse queryResponse= httpSolrClient.query(solrQuery);

        httpSolrClient.commit();

        List<goods> list=  queryResponse.getBeans(Goods.class);

        System.out.println(list.toString());
       // ModelAndView modelAndView=new ModelAndView();
        //modelAndView.addObject("goodsList",list);
       // modelAndView.setViewName("searchList");

        //return modelAndView;
        return "success";
    }
</goods>

Original: https://www.cnblogs.com/daimenglaoshi/p/16849485.html
Author: 呆萌老师
Title: solr

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714233/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 加压测试TPS上不去的性能分析

    阶梯式加压测试接口异常可能存在的原因: 压力机本身性能测试的瓶颈 分析:单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会间接影响TPS ,可以通过进行分布式压测来解决…

    技术杂谈 2023年5月31日
    0100
  • WordPress网站中添加百度统计代码

    百度统计是流量分析平台,帮助收集网站访问数据,提供流量趋势、来源分析、转化跟踪、页面热力图、访问流等多种统计分析服务,同时与百度搜索、百度推广、云服务无缝结合,为网站的精细化运营决…

    技术杂谈 2023年7月11日
    0115
  • ant design mini

    外包项目可以找我,前端后端一锅端,作者:漫思,转载请注明原文链接:https://www.cnblogs.com/sexintercourse/p/16551655.html 如有…

    技术杂谈 2023年6月1日
    0128
  • VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程

    前言这是《VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程》一文的姐妹篇教程,如果你需要阅读它,请点击这里。2020 年,CentOS 宣布:计划未来将重…

    技术杂谈 2023年7月11日
    0131
  • 预训练模型简要介绍

    从字面上看,预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的,预训练…

    技术杂谈 2023年7月11日
    0115
  • 测试驱动开发(TDD)

    测试应用有很多方法,例如,黑盒测试、白盒测试、迭代测试等,然而,这些方法都是从宏观上描述测试的。为了在技术上保障测试的效果,Kent Beck(也是极限编程创始人)提出了在结果上进…

    技术杂谈 2023年5月31日
    0115
  • 人脸识别经典算法三:Fisherface(LDA)

    Fisherface是由Ronald Fisher发明的,想必这就是Fisherface名字由来。Fisherface所基于的LDA(Linear Discriminant Ana…

    技术杂谈 2023年5月31日
    0121
  • 高企必备项目—SSM框架项目CRM客户管理系统

    首先我们来了解一下什么是CRM客户管理系统? CRM系统包括一些核心的客户关系管理业务功能,如:潜在客户、客户管理、拜访管理、商机管理、订单管理等模块,满足企业客户关系信息化的要求…

    技术杂谈 2023年7月25日
    0103
  • 《西方经济学(微观部分)》(第7版)概念梳理

    一、需求、供给和均衡价格 蛛网模型 概念:运用弹性原理解释某些生产周期较长的商品在失去均衡时发生的不同波动情况的一种动态均衡分析理论。 非均衡时的波动情况 => 供、需弹性不…

    技术杂谈 2023年5月31日
    0110
  • Gin框架源码解析【建议收藏】

    Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习。gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了。我们可以追着代码…

    技术杂谈 2023年5月30日
    091
  • Go基础:基础语法与使用

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。 1. 变量 声明变量 var a int var b string var c []float32 // 这种形式…

    技术杂谈 2023年7月24日
    090
  • Mac安装homebrew问题

    使用官方的命令总是无法安装成功。 下面可以快速实现安装: 步骤如下: 1.终端: csharp;gutter:true;/bin/zsh -c “$(curl -fsSL http…

    技术杂谈 2023年5月31日
    0129
  • K8s-小型综合实验(k8s+keeplived+nginx+iptables)

    K8S小型综合实验(k8s+keeplived+nginx+iptables) 实验目的 1.Kubernetes 区域可采用 Kubeadm 方式进行安装。 2.要求在 Kube…

    技术杂谈 2023年7月11日
    0113
  • 为BlueLake主题增加自定义icon图标

    一、前言 hexo 的 Bluelake 主题是我一直在用的,简单大方,很喜欢。但最近有了添加自定义 icon 图标的需求,比如,添加 “地址”、&#822…

    技术杂谈 2023年7月25日
    096
  • cesium 自定义时间轴 通过改变时间设置光照效果[转]

    cesium 自带timeline animation空间有时候满足不了项目的需求,需求要通过自己设置时间来改变光照 this.viewer = new Cesium.Viewer…

    技术杂谈 2023年5月31日
    099
  • 实战篇:断点续传?文件秒传?手撸大文件上传

    各位看官大家好,今天给大家分享的又是一篇实战文章,希望大家能够喜欢。 开味菜 最近接到一个新的需求,需要上传 2G左右的视频文件,用测试环境的 OSS试了一下,上传需要十几分钟,再…

    技术杂谈 2023年7月11日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球