solr的安装与使用

http:lo 

solr的介绍:

    Solr是一个独立的企业级搜索应用服务器,它对外提供API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML格式,生成索引(solr生成倒排索引,数据库生成索引是二叉索引,效率差距很大);也可以通过发HTTP get操作提出查询请求,并得到XML格式的返回结果,Solr是一个类似于GOOgle或者Bing的 全文检索引擎,Solr是与搜索引擎优化(SEO)相关联的。很多公司也使用

elasticearth作为搜索引擎。

 

Solr与elasticearth性能比较:请参照:http://www.cnblogs.com/chowmin/articles/4629220.html。

 

下面我们就Solr安装,我用的是5.0.0版本,要求JDK1.7+;

一。Solr安装

Solr是apache旗下的免费项目。可以去www.apache.org官网下载。

1.下载以后解压D:\solr-5.0.0

2.运行更简单,我知道的三种运行方式:

第一种启动方式:dos模式下进入bin目录然后执行命令:

第二种启动方式:dos模式下进入servermul执行命令:

第三种启动方式:在tomcat中启动,我们只需要把server目录中的webapps下的solr.war取出来放入tomcat的webapp目录就行

 

 3.浏览器运行查看是否成功:前两种:执行 http://localhost:8983/solr

 

 

 

 

 

看到这个页面就完成solr的启动了。

二。新建core模块

启动solr以后,我们如何使用呢?。

我们可以把solr看成一个数据库。数据库启动了,如何使用呢?。那就是建表。

我们把core当成solr服务器的创建表。

 

1.首先:我们找到安装solr目录下server目录下的solr目录,比如我的是:

D:\solr-5.0.0\server\solr

 

 

2.我们创建core的文件夹。 我创建的core的名字为artcile文件,里面创建data文件夹和conf文件

 

 

 3.然后我们找到如下图,所示的位置。把conf整个文件夹复制到我们,刚刚创建的conf中。覆盖就行,

 

 4.这样我们完成了文件夹的准备工作:然后我们启动solr。进入solr的管理页面中来:

 

 

 大家看到左边有个 core admin菜单,点进去。

 

 

 看到add core 按钮,在点进入

 

 这个

然后我们点击 add core按钮。完成了core的创建。

 

如何查看我们刚刚创建的core,

 

看到 core selector这个选择框了没,点击一下,你就能看到我们刚刚创建的core

 

 

 选中。以后我们会看到如下的界面:

这就完成了core的创建了,

创建core以后那么我们如何在java中使用的

三。solr的java 使用。

直接看代码:

package com.demo.web.solr.PDF;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;

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.impl.HttpSolrClient;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;


public class SolrInsertTest {
    //solr 服务器地址
    public static final String solrServerUrl = "http://localhost:8983/solr";
    //solrhome下的core
    public static final String solrCroeHome = "artcile";
    SolrClient solrclient;
   public SolrInsertTest(){
       this.solrclient=new HttpSolrClient(solrServerUrl + "/" + solrCroeHome);
   }   
    //增加文档:addDucument()  
  @Test
    public void addDucument() throws IOException{
        System.out.println("======================add doc ===================");

        Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

        for (int i =6; i < 9; i++) {
            SolrInputDocument doc = new SolrInputDocument();
            doc.addField("id", i*100);
            doc.addField("name", "user"+i);
            doc.addField("price", "100");
            doc.addField("description", "新增文档"+i);
            doc.addField("doc", "d09ffe7ec68744ceb342a658be6e2c1a");

            docs.add(doc);
        }
        try {           
           UpdateResponse rsp = solrclient.add(docs);
           // UpdateResponse rsp = solrclient.addBean(docs);
            System.out.println("Add doc size" + docs.size() + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());        
            UpdateResponse rspcommit = solrclient.commit();
            System.out.println("commit doc to index" + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());

        } catch (SolrServerException  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
    
    
    
    
  
   //@Test
    public void queryDocuments(){
        System.out.println("-----------查询文档:queryDocuments()----------- ");
        SolrQuery params = new SolrQuery();

        System.out.println("======================query===================");

        params.set("q", "*:*");
        params.set("start", 0);
        params.set("rows", 20);
        params.set("sort", "id asc");

        try {
            QueryResponse rsp = solrclient.query(params);
            SolrDocumentList docs = rsp.getResults();
            System.out.println("查询内容:" + params);
            System.out.println("文档数量:" + docs.getNumFound());
            System.out.println("查询花费时间:" + rsp.getQTime());

            System.out.println("------query data:------");
            for (SolrDocument doc : docs) {
                // 多值查询
                @SuppressWarnings("unchecked")
                String id = doc.getFieldValue("id").toString();
                String name = (String) doc.getFieldValue("name");
                String price = String.valueOf(doc.getFieldValue("price"));
                String des = (String) doc.getFieldValue("description");                
               List<String> dock = (List)doc.getFieldValue("doc");               

                System.out.println("id:"+id+"\t name:" + name + "\t description:"+des+"\t price:"+price+"\t doc:"+dock );
            }
            System.out.println("-----------------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 
    
   
    
    //@Test
    public void deleteById(String id) {
         System.out.println(" -----------删除文档BY ID:deleteById()-----------   ");
        System.out.println("======================deleteById ===================");

        try {
            UpdateResponse rsp = solrclient.deleteById(id);
            solrclient.commit();
            System.out.println("delete id:" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
        }
    }
   
    
    
   // -----------删除文档BY QUERY:deleteByQuery()-----------      
    public void deleteByQuery(String query) {
        System.out.println("======================deleteByQuery ===================");

        UpdateResponse rsp;

        try {
            UpdateRequest commit = new UpdateRequest();
            commit.deleteByQuery(query);
            commit.setCommitWithin(500);
            commit.process(solrclient);
            System.out.println("url:"+commit.getPath()+"\t xml:"+commit.getXML()+" method:"+commit.getMethod());
//            rsp = client.deleteByQuery(query);
//            client.commit();
//            System.out.println("delete query:" + queryCon + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
        }

    }


//-----------更新文档:updateDocuments()-----------
    //@Test
 public void updateDocuments(int id,String fieldName, Object fieldValue) {
        System.out.println("======================updateField ===================");
        HashMap<String, Object> oper = new HashMap<String, Object>();
//        多值更新方法
//        List<String> mulitValues = new ArrayList<String>();
//        mulitValues.add(fieldName);
//        mulitValues.add((String)fieldValue);
        oper.put("set", fieldValue);

        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", id);
        doc.addField(fieldName, oper);
        try {
            UpdateResponse rsp = solrclient.add(doc);
            System.out.println("update doc id:" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
            UpdateResponse rspCommit = solrclient.commit();
            System.out.println("commit doc to index" + " result:" + rspCommit.getStatus() + " Qtime:" + rspCommit.getQTime());

        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String args[]) throws IOException {
        SolrInsertTest test = new SolrInsertTest();

        //添加文档
         test.addDucument();

        // 删除文档
      //test.deleteById("200");
        test.deleteByQuery("name:user3");

        //更新文档
        test.updateDocuments(400, "name", "user新");

        // 查询文档
       test.queryDocuments();
    }   
    
    
    
    
}

 java开发步骤:

1.创建连接

2.完成我们参数的引入

3.提交我们的参数增加到solr服务器中

 

开发注意:.首先大多数回报错,说找不到某个Filed ,或者Http请求405错误。

这种错误解决:

第一种。必须看清楚solr服务器地址里面有带 #,然而我们代码开发中不需要。

 第二种:就是我们参数输入的时候,像我们现在用的参数,id.name,price,description,doc这些我们必须在solr中有才行。

就像我们表中的字段是一个意思,我们必须在solr服务器找这些字段。

 

那么我们如何在solr服务器中设置我们需要的字段呢?

我们回到创建的artcile目录中,找到conf中的scheme.xml  如下图:

 

 然后打开

在这里面我们可以看看我们solr服务器中默认给我们的字段,如果你需要别的字段,只需要,添加 field 然后name定义你想要的字段就行,

例如:我们刚刚测试的代码中,有个doc字段。我们就需要在这里添加,

 

添加完成以后我们可以去前台页面查看这个字段。

回到这个页面中

 

 

 然后我们可以看到左边菜单中有个Analysis按钮

点击一下:你就能在这里查看刚刚添加的字段了,

 

 至此完成真个solr的使用。

 

posted @ 2017-11-29 11:21  技术专家  阅读(184)  评论(0)    收藏  举报