学习Solr前需要有Lucene的基础

Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html

1.部署Solr到Tomcat(Windows)

  Solr自带小型服务器jetty,但在我们开发环境中,习惯使用Tomcat,所以把Solr部署到Tomcat上(Tomcat 8.0以上,jdk 1.8以上)

  其实步骤相同,但在windows配置要方便一些,所以第一次还是使用Windows来部署。

  1.1 准备工作

    Solr下载地址:http://archive.apache.org/dist/lucene/solr/

    Tomcat下载地址:http://tomcat.apache.org/  

  1.2 把 solr-7.5.0\server\solr-webapp下的webapp文件夹移到apache-tomcat-9.0.12\webapps下并改名solr(这个名字随便起)

  1.3 导入运行时候需要的依赖包,把solr-7.5.0\server\lib\ext下的包放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下,

把solr-7.5.0\server\lib下m开头的五个jar和gmetric4j-1.0.7.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下

  1.4 在任意地方创建一个solrHome,里面有一个solrCore,个人和我们的数据库类似,一个用户下可以创建很多个不同的数据库

  1.5 把solr-7.5.0\server下的solr文件夹下的内容复制到solrHome下

  1.6 修改默认的solrHome,在apache-tomcat-9.0.12\webapps\solr\WEB-INF的web.xml修改 加上

    

  1. <env-entry>
  2. <env-entry-name>solr/home</env-entry-name>
  3. <env-entry-value>D:\Solr\solrHome</env-entry-value>
  4. <env-entry-type>java.lang.String</env-entry-type>
  5. </env-entry>

  env-entry-value写自己的solrHome位置

  并注释以下这段话,不然会报403

  

  1. <!-- Get rid of error message -->
  2. <!--<security-constraint>
  3. <web-resource-collection>
  4. <web-resource-name>Disable TRACE</web-resource-name>
  5. <url-pattern>/</url-pattern>
  6. <http-method>TRACE</http-method>
  7. </web-resource-collection>
  8. <auth-constraint/>
  9. </security-constraint>
  10. <security-constraint>
  11. <web-resource-collection>
  12. <web-resource-name>Enable everything but TRACE</web-resource-name>
  13. <url-pattern>/</url-pattern>
  14. <http-method-omission>TRACE</http-method-omission>
  15. </web-resource-collection>
  16. </security-constraint>-->

  1.7 把solr-7.5.0\server\resources的log4j2.xml放到apache-tomcat-9.0.12\webapps\solr\WEB-INF的classes文件夹下,classes文件刚开始没有,自己创建一个。

  1.8 启动Tomcat

  

2.界面的简单介绍

    

  2.1.Dashboard

    仪表盘,显示了系统资源,jvm等信息

  2.2.Logging

    Solr运行的日志

  2.3 Core Admin

    Solr Core的管理页面

  2.4 java properties

    Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息

  2.5 Thread Dump

    显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息

3.创建一个solrCore

  既然之前说类似于数据库,使用数据库之前肯定就要先创建数据库,我们使用Solr就要先创建一个solrCore,直接使用可视化界面创建

  

  报错了,解决方法:solr-7.5.0\server\solr\configsets\_default下的config文件移到solrHome\new_core下

  

  重启Tomcat

  在点击下add core 就出现了

 

  一个MySql实例可以创建多个数据库,所以我们当然可以创建多个solrCore啦

  

  修改core.properties

    

  

  重启Tomcat

  

4.Solr中的重要信息配置

    在增删查改前,我们要先了解一点Solr的信息配置

    在Lucenc中有域和索引的概念,域是由域名和域的内容构成的,域名经过分词,形成索引。

    在Lucene中域是有类型的,比如StringField,LongField类型等,那么在Solr中域的类型由写在solrHome\new_core\conf\managed-schema中 

  4.1 fieldType 域类型

    

  1.    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="" multiValued="true">
  2. <analyzer type="index">
  3. <tokenizer class="solr.StandardTokenizerFactory"/>
  4. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
  5. <!-- in this example, we will only use synonyms at query time
  6. <filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
  7. <filter class="solr.FlattenGraphFilterFactory"/>
  8. -->
  9. <filter class="solr.LowerCaseFilterFactory"/>
  10. </analyzer>
  11. <analyzer type="query">
  12. <tokenizer class="solr.StandardTokenizerFactory"/>
  13. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
  14. <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
  15. <filter class="solr.LowerCaseFilterFactory"/>
  16. </analyzer>
  17. </fieldType>

    name:类型名字

    class:指定该域类型对应的solr类型

    analyzer:指定分词器(中文使用ikanalyzer)属性type index,query表示在创建索引和查询索引时使用的分词器

    tokenizer:分词器的类型

    filter:过滤器的类型

  4.2 fieldtype 域

    

  1. <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

    name:域的名字

    type:域的类型(自己定义的)

    indexed:是否索引

    stroed:是否存储

    required:是否必须

    multiValued:是否多值

  4.3 dynamicField 动态域

    

  1. <dynamicField name="*_i" type="pint" indexed="true" stored="true"/>

    例子:为文档增加域的时候,你可以用 “随便起的_i”当做域名, 凡是以_i结尾的 type都是pint,需要indexed,需要stored  

  4.4 uniqueKey 唯一键

  

  1. <uniqueKey>id</uniqueKey>

    表示id唯一

5.配置中文分词器 ikanalyzer

  既然要添加索引,添加索引之前需要luncenc帮我们分词,而官方的分词器对中文的分词基本是稀烂的,所以我们需要使用第三方的分词器 ikanalyzer

  5.1 下载ikanalyzer

  下载地址:https://github.com/magese/ik-analyzer-solr7

  5.2 配置ikanalyzer

  首先把ik-analyzer-7.5.0.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib目录下

  然后:

  

  5.3 使用ikanalyzer

  在solrHome\new_core\conf\managed-schema中自定义fieldtype和field,使用中文分词器来分词

  

  1.  <!--IKAnalyzer-->
  2. <fieldType name="text_ik" class="solr.TextField">
  3. <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  4. </fieldType>
  5. <!--IKAnalyzer Field-->
  6. <field name="title_ik" type="text_ik" indexed="true" stored="true" />
  7. <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

  5.4 测试一下

    重启tomcat

      

    

    问题来了,我的名字没有加到词库,但是如果随着新的词语出现,我们就没办法分词了,ik分词器给我们提供了可以手动或自动加入词汇的方法

    apache-tomcat-9.0.12\webapps\solr\WEB-INF\classes下的ext.dic加入自己的词汇,重启Tomcat

    

    

6.使用可视化界面增删查改文档

  增加文档

  

  更新文档

  

  删除文档

  

  查询文档

    首先查询所有  *:*

  

      加上过滤条件等一系列条件

    

      

      q: 查询关键字 查询所有*:* 查询固定的 就用 域名:域值

      fq:过滤查询

      sort:排序  格式   :  先写域名然后加升序或降序 ,不同域用逗号隔开        id desc,title_ik desc

      start row : 用于分页

      fl:返回指定的域和域值,不同域用逗号隔开

      df:指定一个搜索域,用处:比如有的时候你在百度查 “Solr”,你输入的应该直接是Solr,不会输一个Content:Solr吧,那么我们就可以指定默认搜索域Content,你输入Solr就默认加上域值。

      wt:指定输出格式

      hi:是否高亮,在指定的域中,比如我搜索中国,经过分词,在title_ik域中找到了中国,那么在中国这两个字之前就加上pre前缀,在后面加上post后缀

7.使用SolrJ

  Solr和SolrJ的关系类似于MySQL和JDBC,用java代码来完成文档的增加。

  7.1坏境搭建    

  1. <dependency>
  2. <groupId>org.apache.solr</groupId>
  3. <artifactId>solr-solrj</artifactId>
  4. <version>7.5.0</version>
  5. </dependency>

  7.2 代码

  1. package com.dingyu.sSolrJ;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.commons.math3.geometry.partitioning.BSPTreeVisitor.Order;
  6. import org.apache.solr.client.solrj.SolrQuery;
  7. import org.apache.solr.client.solrj.SolrQuery.ORDER;
  8. import org.apache.solr.client.solrj.SolrServerException;
  9. import org.apache.solr.client.solrj.impl.HttpSolrClient;
  10. import org.apache.solr.client.solrj.response.QueryResponse;
  11. import org.apache.solr.common.SolrDocument;
  12. import org.apache.solr.common.SolrDocumentList;
  13. import org.apache.solr.common.SolrInputDocument;
  14. import org.junit.Test;
  15.  
  16. /**
  17. * SolrJ的简单使用
  18. *
  19. * @author 丁宇
  20. *
  21. */
  22. public class SolrJTest {
  23. /**
  24. * 获得连接
  25. *
  26. * @return 连接对象
  27. */
  28. private HttpSolrClient getClient() {
  29. HttpSolrClient client = new HttpSolrClient.Builder("http://127.0.0.1:8080/solr/new_core").build();
  30. return client;
  31. }
  32.  
  33. /**
  34. * 增加/修改文档
  35. *
  36. * @throws SolrServerException
  37. * @throws IOException
  38. */
  39. @Test
  40. public void addOrUpdateDoc() throws SolrServerException, IOException {
  41. // 获得连接对象
  42. HttpSolrClient client = getClient();
  43. // 创建一个文档对象
  44. SolrInputDocument document = new SolrInputDocument();
  45. // 加域
  46. document.addField("id", "521");
  47. document.addField("title_ik", "张三说的在理");
  48. // 提交
  49. client.commit();
  50. client.close();
  51. }
  52.  
  53. /**
  54. * 删除文档
  55. *
  56. * @throws SolrServerException
  57. * @throws IOException
  58. */
  59. @Test
  60. public void deleteDoc() throws SolrServerException, IOException {
  61. // 获得连接对象
  62. HttpSolrClient client = getClient();
  63. // 根据id删除
  64. client.deleteById("521");
  65. client.commit();
  66. client.close();
  67. }
  68. /**
  69. * 查询文档
  70. * @throws SolrServerException
  71. * @throws IOException
  72. */
  73. @Test
  74. public void selectDoc() throws SolrServerException, IOException {
  75. // 获得连接对象
  76. HttpSolrClient client = getClient();
  77. // 搜索条件
  78. SolrQuery query = new SolrQuery("*:*");
  79. //设置过滤条件
  80. query.setFilterQueries("title_ik:[10 TO 20]");
  81. //排序
  82. query.setSort("title_ik",ORDER.asc);
  83. //分页
  84. query.setStart(0);
  85. query.setRows(10);
  86. //要显示的域
  87. query.setFields("id","title_ik");
  88. // 设置默认搜索域
  89. query.set("df", "product_name");
  90. // 设置高亮
  91. query.setHighlight(true);
  92. query.addHighlightField("title_ik");
  93. query.setHighlightSimplePre("<em>");
  94. query.setHighlightSimplePost("</em>");
  95.  
  96. //执行查询
  97. QueryResponse response = client.query(query);
  98. //查询结果,一个文档集合
  99. SolrDocumentList results = response.getResults();
  100. //遍历
  101. for (SolrDocument solrDocument : results) {
  102. //根据key 获得value
  103. System.out.println(solrDocument.get("id"));
  104. }
  105. client.close();
  106. }
  107.  
  108. }

  7.3测试结果

  

  

  

  

    

Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用的更多相关文章

  1. Solr学习笔记之1、环境搭建

    Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...

  2. Solr学习笔记之3、Solr dataimport - 从SQLServer导入数据建立索引

    Solr学习笔记之3.Solr导入SQLServer数据建立索引 一.下载MSSQLServer的JDBC驱动 下载:Microsoft JDBC Driver 4.0 for SQL Server ...

  3. Solr学习笔记之2、集成IK中文分词器

    Solr学习笔记之2.集成IK中文分词器 一.下载IK中文分词器 IK中文分词器 此文IK版本:IK Analyer 2012-FF hotfix 1 完整分发包 二.在Solr中集成IK中文分词器 ...

  4. Solr学习笔记之5、Component(组件)与Handler(处理器)学习

    Solr学习笔记之5.Component(组件)与Handler(处理器)学习 一.搜索篇 拼写检查(spellCheck) 作用:用来检查用户输入的检索内容是否存在,如果不存在则给它提示出相近或相似 ...

  5. Solr学习笔记之4、Solr配置文件简介

    Solr学习笔记之4.Solr配置文件简介 摘自<Solr in Action>. 1. solr.xml – Defines one or more cores per Solr ser ...

  6. solr学习笔记-入门

    solr学习笔记 1.安装前准备 solr依赖java 8 运行环境,所以我们先安装java.如果没有java环境无法启动solr服务,并且会看到如下提示: [root@localhost solr- ...

  7. Java web与web gis学习笔记(一)——Tomcat环境搭建

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  8. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  9. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

随机推荐

  1. Flutter

    2015年, Google 内部开始测试另一种高性能的编程方式,那就 Google 的 Sky 项目.Sky 项目使用网页开发语言Dart开发原生Android 应用,强调应用的运行速度和与 Web ...

  2. java 的基本数据类型及转换

    数据类型精度: byte 8 位short 16 位int 32 位long 64 位float 32 位double 64 位char 16 位 boolean 占几位要看 jvm 的具体实现, 虽 ...

  3. json转义 使用 JavaScriptSerializer 时 需要添加的引用

    当创建JavaScriptSerializer创建对象时,JavaScriptSerializer jss=new JavaScriptSerializer():时. 1.   需要添加的是Syste ...

  4. C语言面试题分类->字符串处理

    1.strlen:计算字符串长度(不包含'\0') 实现想法:遍历字符串,直到'\0'结束 #include<stdio.h> #include<stdlib.h> #incl ...

  5. 企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. Netty的核心组件

    Netty的主要组成模块: Channels Callbacks Futures Events 和 handlers 这些模块代表了不同类型的概念:资源,逻辑和通知.你的应用将会利用这些模块来获取网络 ...

  7. Java设计模式之单例模式,笔记完整到不敢想象

    单例模式: 作用 保证一个类只有一个实例,并且提供一个访问该实例的全局访问入口 单例模式的常用 1.Windows的任务管理器2.Windows的回收站,也是一个单例应用3.项目中的读取配置文件的对象 ...

  8. [Swift]LeetCode307. 区域和检索 - 数组可修改 | Range Sum Query - Mutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  9. [Swift]LeetCode797. 所有可能的路径 | All Paths From Source to Target

    Given a directed, acyclic graph of N nodes.  Find all possible paths from node 0 to node N-1, and re ...

  10. SpringCloud微服务架构

    1.Eureka承载大规模系统每天千万级访问的原理 1).首先每个服务的eureka client组件默认30秒发送一个请求到eureka server拉取最近有变化的服务信息: 2).eureka还 ...