使用solr搭建搜索服务器

Posted by silsuer on August 29, 2018

使用solr搭建搜索服务器

前言

solr 是一个用 java 写的搜索服务器,支持分布式集群部署等各种特性,现在看来应该是 目前使用范围最广的搜索服务器了

研究了三天,因为想直接部署成分布式的,网上的各种教程都是太过久远的了,绕来绕去就死在配置文件里了

所以先不想做分布式的问题了,先搭一个单机版的,压力上来了再装zookeeper做分布式

安装

系统为 CentOS7

  1. 新建一个专门负责搜索服务的用户search,将下载的solr二进制包放在这个用户的家目录中,我这里是直接把本地压缩包扔进了服务器中

    // 需要先建立一个专门负责搜索服务的账户: search
    useradd search
         
         
    // 在search家目录下新建服务文件夹
    mkdir /home/search/search-service
         
         
    // 将本地代码上传到服务文件夹下
    scp solr-7.4.0.zip root@testing:/home/search/search-service/
    
  2. 解压solr-7.4.0.zip

    // 进入目录
    cd /home/search/search-service/
     
     
     
    // 解压缩
    unzip solr-7.4.0.zip
     
    // 将服务权限赋给search
    chown -R search:search /home/search/search-service/solr-7.4.0/server/
    
  3. 进入solr目录

       cd solr-7.4.0/
    
  4. 新建 /usr/java目录,在其中下载jdk

     http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
         
         
     mkdir /usr/java
     // 我是从本地将jdk上传到服务器中
     scp jdk-8u181-linux-x64.tar.gz root@testing:/usr/java/
    
  5. 解压缩jdk包

     cd /usr/java/   
     tar -zxvf jdk-8u181-linux-x64.tar.gz
    
  6. 配置环境变量

      vim /etc/profile
          
          
      // 在最后添加环境变量,其中根据jdk版本修改JAVA_HOME和JRE_HOME
      #set java environment
      JAVA_HOME=/usr/java/jdk1.8.0_181
      JRE_HOME=/usr/java/jdk1.8.0_181/jre
      CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
      PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
      export JAVA_HOME JRE_HOME CLASS_PATH PATH
    
  7. 让修改生效

      source /etc/profile
    
  8. 验证jdk是否安装成功

      java -version
          
      // 如果有如下输出,证明安装成功
      java version "1.8.0_181"
      Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
      Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
    
  9. 启动solr节点

     // 切换用户
     su search
         
         
     // 进入solr根目录
     cd /home/search/search-service/solr.7.4.0/
         
         
     // 启动节点
     bin/solr start 可以使用 -p 8983 指定端口默认是8983端口
    

创建core

core是搜索的核心,可以把它理解为集合,比如我需要搜索用户和帖子,那么就需要创建两个core:usersarticles

        bin/solr create -c users  // 索引用户
        bin/solr create -c articles  // 索引文章

进入后台进行查看

      // 获得外网ip
      curl ip.gs
       
       
      // 在浏览器中访问后台
      http://ip:8983
       
       
      // 服务搭建完成后要关闭外部端口,从内网中访问
     

API

我第一个用的搜索服务器是 xunsearch,需要做很多配置,我以为搜素软件都这样…233

但是实际上solr不需要这么麻烦,如果仅仅是单机版,简单的搜索配置完全可以使用http请求来设置

我们假设solr的后台地址为: http://localhost:8983/solr

core 名为 my_collection

  • 添加索引

    • 添加单个

         curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update/json/docs' --data-binary '
         {
           "id": "1",
           "title": "Doc 1"
         }'
      
    • 添加多个

        curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary '
        [
          {
            "id": "1",
            "title": "Doc 1"
          },
          {
            "id": "2",
            "title": "Doc 2"
          }
        ]'
    
    • 要注意,仅仅添加后是无法搜索到文档的,还需要commit才可以
  • 更新索引

      curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary '
      {
        "add": {
          "doc": {
            "id": "DOC1",
            "my_field": 2.3,
            "my_multivalued_field": [ "aaa", "bbb" ]   
          }
        },
        "add": {
          "commitWithin": 5000, 
          "overwrite": false,  
          "doc": {
            "f1": "v1", 
            "f1": "v2"
          }
        },
          
        "commit": {},
        "optimize": { "waitSearcher":false },
          
        "delete": { "id":"ID" },  
        "delete": { "query":"QUERY" } 
      }'
    
    

    可以看到,添加、commit删除等操作,都可以通过1次http请求来设置

  • 查询

查询的路径为 http://{$url}/select?q=xxx&sort=xxx&start=xxx&rows=xxx

参数q为查询主体,sort为排序方式,rows为查询行数,start为查询起始位置

例如users表中有 name字段,

  • 我们需要查询 namesilsuer的用户

    那么 参数q=name:silsuer

  • 并且按照创建时间倒序查询

    参数q=name:silsuer&sort=created_at desc

  • 每页查出10条数据,并且本次查第二页

    参数start的计算方式为: start=num*(page-1) -> start=10*(2-1)=10

    参数为:q=name:silsuer&sort=created_at desc&start=10&rows=10

  • 注意:上面的参数中的空格冒号之类的,需要url编码后使用

以上就是solr的基本用法.