记Solr学习心得

一、Solr的安装使用

Solr以前的版本须要依托于Tomcat做为载体才能进行使用,不过如今Solr已经支持独立运行,解压后运行指令即可启用。安装以前须要注意,Solr 8版本所须要的JDK须要8.0或以上。html

[root@localhost]# wget http://mirror.bit.edu.cn/apache/lucene/solr/8.0.0/solr-8.0.0.tgz
[root@localhost]# tar -zxvf solr-8.0.0.tgz
复制代码

Solr的目录结构

  • bin/
    该目录包含了几个重要的脚本,使用这些脚本可以更加便捷的使用Solr。
    • solr and solr.cmd
      这是Solr的控制脚本,bin/solr(*nix下),bin/solr.cmd(Windows下)。这也是Apache最为推荐的去启动或中止Solr的运行工具。
    • post
      提供简单的命令行模式将内容post到Solr上。
    • solr.in.sh and solr.in.cmd
      这分别是*nix和Windows下的属性文件。在这里你能够设置Jetty、Java、Solr的系统权限属性。
  • contrib/
    该目录下提供了一些额外插件,可针对不一样的使用场景使用这些插件。
  • dist/
    该目录下包含了Solr运行的主要.jar文件。
  • docs/
    该文件夹下含有一个连接,经过此连接能访问在线的Solr的javadoc。
  • example/
    该文件夹下包含了几个使用Solr各部分功能的实例。
  • licenses/
    该文件夹下包括了Solr所使用到的第三方jar包的使用许可证。
  • server/
    该文件夹是solr的核心,readme文档提供了一个详细的简介,须要注意的:
    • Solr的管理UI(server/solr-webapp)
    • Jetty依赖(server/lib)
    • 日志文件(server/logs)以及日志配置文件(server/resources)
    • 配置文件模板(server/solr/configsets)

启动Solr

进入bin目录下经过脚本启动Solr:java

[root@localhost]# cd solr-8.0.0/bin
[root@localhost]# ./solr start
复制代码

当一上来启动时,系统会以下报错,表示您的最大打开文件数、最大进程数应该上调到65000。若是root用户启动还会警告存在风险,须要添加-force才可启动。mysql

*** [WARN] *** Your open file limit is currently 1024.  
 It should be set to 65000 to avoid operational disruption. 
 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
*** [WARN] ***  Your Max Processes Limit is currently 7183. 
 It should be set to 65000 to avoid operational disruption. 
 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
 WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
         Please consult the Reference Guide. To override this check, start with argument '-force'
复制代码

咱们能够经过修改打开文件、进程限制值解决限制的问题,也能够经过修改solr.in.sh关闭SOLR_ULIMIT_CHECKS检查,强制启动。web

[root@localhost]# vim solr.in.sh 
复制代码

修改配置

[root@localhost]# ./solr start -p 8983 -force # -p 指定端口默认8983 -force(root用户必选) 
NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 80.

Started Solr server on port 80 (pid=19359). Happy searching!
 [root@localhost]# 
复制代码

访问一下,看到仪表盘即为大功告成:spring

成功界面

二、建立core

在管理页面建立core以前,须要在server下的solr目录下创建一个和将要建立core同名的文件夹。并在该文件夹下建立conf(配置文件夹),将配置文件放入其中。在server/solr/configsets/目录下有能够直接拽过来用的配置模板,本文直接把_default下的conf文件夹拽过来使用。sql

[root@localhost]# cd solr-8.0.0/server/solr
[root@localhost]# mkdir test # 为将要建立core的名称
[root@localhost]# cp -rf configsets/_default/conf test/
复制代码

而后咱们去Solr管理界面建立core: shell

建立
出现下图即为建立成功:
建立成功

三、管理页面操做core

在操做Core以前,须要在建立的core的conf下的managed-schema文件中添加须要用到的字段。关于Documents、Fields、Schema的设计可在官方文档中查看。除了几个默认字段,本文所用到的:数据库

<field name="company" type="string" multiValued="false" indexed="true" stored="true"/>
 <field name="person" type="string" multiValued="false" indexed="true" stored="true"/>
复制代码

添加完了去刷新一下core apache

刷新
以后再查看对应core下的 Schema选项,出现相应字段即为添加成功:
添加成功

添加

在旁边一列的Documents下进行添加操做: vim

添加操做

查询

旁边的Query界面中可进行查询。q下面的一行表示查询的参数,左 * 是字段名,右 * 是查询条件, *表明任意值,下图为查询全部记录:

查询操做

更新

Solr中的全部字段中存在一个惟一索引字段,可在managed-schema中的 <uniqueKey></uniqueKey>中定义,默认id字段为惟一索引。修改时只须要再次添加惟一索引字段索引的内容便可完成更新替换。

更新
更新后:
更新后

删除

在添加界面内(Documents)的Document Type中选择XML方式,可根据id和根据查询进行删除。

根据id删除

<delete>
    <id>1</id>
</delete>
<commit/>
复制代码

根据查询删除

<delete>
    <query>person:马化腾</query>
</delete>
<commit/>
复制代码

四、整合SpringBoot使用Solr

引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-solr</artifactId>
        </dependency>
复制代码

配置

spring:
 data:
 solr:
 host: http://192.168.78.132:8983/solr/test    #http://你的地址/solr/你建立的core的名称
复制代码

实体类

package com.yurui.solrjdemo.entity;

import org.apache.solr.client.solrj.beans.Field;

public class Info {
    @Field     //将要添加到Solr中的字段的注解
    private String id;
    @Field
    private String person;
    @Field
    private String company;
    //setters,getters,toString省略
}

复制代码

基本的Demo

package com.yurui.solrjdemo;

import com.yurui.solrjdemo.entity.Info;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.ArrayList;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SolrjdemoApplicationTests {
    @Autowired
    private SolrClient solrClient;

    @Test
    public void test() throws IOException, SolrServerException {
        // 普通字段添加
        SolrInputDocument solrDocument = new SolrInputDocument();
        solrDocument.addField("id", "1");
        solrDocument.addField("person", "李彦宏");
        solrDocument.addField("company", "百度");
        solrClient.add(solrDocument);
        // 实体类添加
        Info info = new Info();
        info.setId("2");
        info.setPerson("无名氏");
        info.setCompany("无名氏");
        solrClient.addBean(info);
        // 提交
        solrClient.commit();
        getAll();
        // 经过查询删除
        solrClient.deleteByQuery("company:百度");
        solrClient.commit();
        getAll();
        // 经过id删除
        solrClient.deleteById("2");
        solrClient.commit();
        getAll();
    }

    /* 查询全部 */
    public void getAll() throws IOException, SolrServerException {
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery("*:*");                   //设置查询参数
        QueryResponse response = solrClient.query(solrQuery);
        System.out.println("全部信息:");
        ArrayList<Info> list = (ArrayList<Info>) response.getBeans(Info.class);
        for (Info temp : list) {
            System.out.println(temp);
        }
    }
}


复制代码

测试效果:

测试效果

五、导入MySQL数据库的内容

数据表

本人用到的数据表结构与数据:

结构
数据

导入jar包

导入数据库数据须要把MySQL驱动mysql-connector-java-8.0.15.jar,Solr目录中dist/下的solr-dataimporthandler-8.0.0.jarsolr-dataimporthandler-extras-8.0.0.jar移动到server/solr-webapp/webapp/WEB-INF/lib下。

修改配置

在core的配置文件夹中的solrconfig.xml中添加:

<requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
复制代码

以后再在配置文件夹中创建与<str></str>中同名文件,并进行配置:

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="你的url" user="你的用户" password="你的密码" />
    <document>
        <entity name="info" query="select * from info">
            <field column="id" name="id" />
            <field column="person" name="person" />
            <field column="company" name="company" />
        </entity>
    </document>
</dataConfig>
复制代码

entityquery对应得到数据的SQL语句。field标签中column对应数据库的字段名,name对应managed-schema中的字段名。在运行以前须要确保相应字段已经在managed-schema中定义,而且可以成功访问到数据库。

测试效果

先重启一下Solr,而后去管理界面对应Core下的Dataimport下操做:

导入操做
成功后会显示成功创建/更新索引:
成功创建
查询一下:
查询结果
到此,已经完成从数据库进行数据的导入。

六、中文分词器

Solr官方自带了简体中文分词器HMM Chinese Tokenizer,存放在contrib/analysis-extras/lucene-libs下的lucene-analyzers-smartcn-8.0.0.jar

导入jar包

首先使用这个插件须要咱们把lucene-analyzers-smartcn-8.0.0.jar移动到server/solr-webapp/webapp/WEB-INF/lib

修改配置

在对应core下的managed-schema中添加以下示例配置(来自官方文档示例):

<fieldType name="text_cn" class="solr.TextField">    
      <analyzer>
        <tokenizer class="solr.HMMChineseTokenizerFactory"/>
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" words="你所定义的中文停用词表"/>
        <filter class="solr.PorterStemFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
复制代码

测试效果

修改完后重启Solr,进入管理界面对应core下的Analysis,出现fieldType中对应的name即为添加成功。

添加成功
当咱们尝试分词“今天是假期的最后一天”对应结果:
尝试分词
至此说明中文分词添加配置完成。接下来咱们建立一个字段进行测试:

<field name="testChinese" type="text_cn" multiValued="false" indexed="true" stored="true"/>
复制代码

而后添加刚才测试的语句,“今天是假期的最后一天”:

语句
根据刚才测试分词的结果,若是输入“假期”会搜索出对应记录,而输入“假”对应为空,实际结果:
输入假期
输入假
可发现,实际结果与预期相符,分词一项测试成功。若对此分词器分词效果不满意,也可更换比较出名的IK分词器。
相关文章
相关标签/搜索