1. 程式人生 > >利用SolrJ操作solr API完成index操作

利用SolrJ操作solr API完成index操作

使用SolrJ操作Solr會比利用httpClient來操作Solr要簡單。SolrJ是封裝了httpClient方法,來操作solr的API的。SolrJ底層還是通過使用httpClient中的方法來完成Solr的操作。

1、 首先,你需要新增如下jar包

其中apache-solr-solrj-3.4.0.jar、slf4j-api-1.6.1.jar可以在下載的apache-solr-3.4.0的壓縮包中的dist中能找到。

2、 其次,建立一個簡單的測試類,完成Server物件的相關方法的測試工作,程式碼如下:

package com.hoo.test;
import
java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import
org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.hoo.entity.Index;
/**
 * <b>function:</b> Server TestCase
 * @author hoojo
 * @createDate 2011-10-19 下午01:49:07
 * @file ServerTest.java
 * @package com.hoo.test
 * @project SolrExample
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @version 1.0
 */
public class ServerTest {
    private SolrServer server;
    private CommonsHttpSolrServer httpServer;
    private static final String DEFAULT_URL = "http://localhost:8983/solr/";
    @Before
    public void init() {
        try {
            server = new CommonsHttpSolrServer(DEFAULT_URL);
            httpServer = new CommonsHttpSolrServer(DEFAULT_URL);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    @After
    public void destory() {
        server = null;
        httpServer = null;
        System.runFinalization();
        System.gc();
    }
    public final void fail(Object o) {
        System.out.println(o);
    }
    /**
     * <b>function:</b> 測試是否建立server物件成功
     * @author hoojo
     * @createDate 2011-10-21 上午09:48:18
     */
    @Test
    public void server() {
        fail(server);
        fail(httpServer);
    }
    /**
     * <b>function:</b> 根據query引數查詢索引
     * @author hoojo
     * @createDate 2011-10-21 上午10:06:39
     * @param query
     */
    public void query(String query) {
        SolrParams params = new SolrQuery(query);
        try {
            QueryResponse response = server.query(params);
            SolrDocumentList list = response.getResults();
            for (int i = 0; i < list.size(); i++) {
                fail(list.get(i));
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } 
    }
}

測試執行server case方法,如果成功建立物件,那你就成功的連結到。

注意:在執行本方法之前,請啟動你的solr官方自動的專案。http://localhost:8983/solr/保證能夠成功訪問這個工程。因為接下來的所有工作都是圍繞這個solr工程完成的。如果你現在還不知道,怎麼部署、釋出官方solr工程,請參考前面的具體章節。

3、 Server的有關配置選項引數,server是CommonsHttpSolrServer的例項

server.setSoTimeout(1000); // socket read timeout 
server.setConnectionTimeout(100); 
server.setDefaultMaxConnectionsPerHost(100); 
server.setMaxTotalConnections(100); 
server.setFollowRedirects(false); // defaults to false 
// allowCompression defaults to false. 
// Server side must support gzip or deflate for this to have any effect. 
server.setAllowCompression(true); 
server.setMaxRetries(1); // defaults to 0.  > 1 not recommended. 
//sorlr J 目前使用二進位制的格式作為預設的格式。對於solr1.2的使用者通過顯示的設定才能使用XML格式。
server.setParser(new XMLResponseParser());
//二進位制流輸出格式
//server.setRequestWriter(new BinaryRequestWriter());

4、 利用SolrJ完成Index Document的新增操作

/**
 * <b>function:</b> 新增doc文件
 * @author hoojo
 * @createDate 2011-10-21 上午09:49:10
 */
@Test
public void addDoc() {
    //建立doc文件
     SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", 1);
    doc.addField("name", "Solr Input Document");
    doc.addField("manu", "this is SolrInputDocument content");
    try {
        //新增一個doc文件
        UpdateResponse response = server.add(doc);
        fail(server.commit());//commit後才儲存到索引庫
        fail(response);
        fail("query time:" + response.getQTime());
        fail("Elapsed Time:" + response.getElapsedTime());
        fail("status:" + response.getStatus());
    } catch (SolrServerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    query("name:solr");
}

在apache-solr-3.4.0\example\solr\conf目錄下的schema.xml中可以找到有關於field屬性的配置,schema.xml中的field就和上面Document文件中的field(id、name、manu)對應。如果出現ERROR:unknown field 'xxxx'就表示你設定的這個field在schema.xml中不存在。如果一定要使用這個field,請你在schema.xml中進行filed元素的配置。具體請參考前面的章節。

注意:在schema.xml中配置了uniqueKey為id,就表示id是唯一的。如果在新增Document的時候,id重複新增。那麼後面新增的相同id的doc會覆蓋前面的doc,類似於update更新操作,而不會出現重複的資料。

5、 利用SolrJ新增多個Document,即新增文件集合

/**
 * <b>function:</b> 新增docs文件集合
 * @author hoojo
 * @createDate 2011-10-21 上午09:55:01
 */
@Test
public void addDocs() {
    Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", 2);
    doc.addField("name", "Solr Input Documents 1");
    doc.addField("manu", "this is SolrInputDocuments 1 content");
    docs.add(doc);
    doc = new SolrInputDocument();
    doc.addField("id", 3);
    doc.addField("name", "Solr Input Documents 2");
    doc.addField("manu", "this is SolrInputDocuments 3 content");
    docs.add(doc);
    try {
        //add docs
        UpdateResponse response = server.add(docs);
        //commit後才儲存到索引庫
        fail(server.commit());
        fail(response);
    } catch (SolrServerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    query("solr");
}

就是新增一個List集合

6、 新增JavaEntity Bean,這個需要先建立一個JavaBean,然後來完成新增操作;

JavaBean:Index的程式碼

package com.hoo.entity;
import org.apache.solr.client.solrj.beans.Field;
/**
 * <b>function:</b> JavaEntity Bean;Index需要新增相關的Annotation註解,便於告訴solr哪些屬性參與到index中
 * @author hoojo
 * @createDate 2011-10-19 下午05:33:27
 * @file Index.java
 * @package com.hoo.entity
 * @project SolrExample
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @version 1.0
 */
public class Index {
    //@Field setter方法上新增Annotation也是可以的
    private String id;
    @Field
    private String name;
    @Field
    private String manu;
    @Field
    private String[] cat;
    @Field
    private String[] features;
    @Field
    private float price;
    @Field
    private int popularity;
    @Field
    private boolean inStock;
    public String getId() {
        return id;
    }
    @Field
    public void setId(String id) {
        this.id = id;
    }
    //getter、setter方法
    public String toString() {
        return this.id + "#" + this.name + "#" + this.manu + "#" + this.cat;
    }
}

注意上面的屬性是和在apache-solr-3.4.0\example\solr\conf目錄下的schema.xml中可以找到有關於field屬性的配置對應的。如果你Index JavaBean中出現的屬性在schema.xml的field配置無法找到,那麼出出現unknown filed錯誤。

新增Bean完成doc新增操作

/**
 * <b>function:</b> 新增JavaEntity Bean
 * @author hoojo
 * @createDate 2011-10-21 上午09:55:37
 */
@Test
public void addBean() {
    //Index需要新增相關的Annotation註解,便於告訴solr哪些屬性參與到index中
    Index index = new Index();
    index.setId("4");
    index.setName("add bean index");
    index.setManu("index bean manu");
    index.setCat(new String[] { "a1", "b2" });
    try {
        //新增Index Bean到索引庫
            
           

相關推薦

利用SolrJ操作solr API完成index操作

使用SolrJ操作Solr會比利用httpClient來操作Solr要簡單。SolrJ是封裝了httpClient方法,來操作solr的API的。SolrJ底層還是通過使用httpClient中的方法來完成Solr的操作。 1、 首先,你需要新增如下jar包 其

淘淘商城22_全文檢索_通過solrjsolr索引庫進行操作

百度網盤:jar包solrj 連結:https://pan.baidu.com/s/1HJ5M4YGyXj4AA3Enf6sDsA  提取碼:rqy9    步驟: 第一步:建立一個java工程 第二步:匯入jar包。包括solrJ的jar包 第三步

Activiti工作流框架學習(二)——使用Activiti提供的API完成流程操作

可以在專案中加入log4j,將logj4.properties檔案拷入到src目錄下,這樣框架執行的sql就可以輸出到到控制檯,log4j提供的日誌級別有以下幾種: Fatal  error  warn  info  debug  trace 一、部署流程定義 1,在工程專

solrj操作solr索引庫(流程)

utf-8 except exception chcon tca hit lis gmv 添加 聲明:博主自己記錄以免忘記,所以無邏輯無參考價值。小女子就是醬紫任性 ---------首先dao層 訪問索引庫的類。定義一些通用的數據訪問方法。 業務邏輯就是查詢索引庫。 參數

Solr API操作

api solr 1、需要在/usr/local/services/solr/solr-4.10.3/example/solr/collection1/conf的solrconfig.xml加上 <requestHandler name="/select" class="solr.SearchH

solrj 操作 solr 集群版

pri ont zookeeper resp dso serve lec image solr 一、添加 @Test public void testAddDocument() throws Exception{ //創建一個集群的連接,應該使用 CloudSol

Java操作SolrSolrJ

log mon print .com tin 方法 updater 服務 exce 添加SolrJ的jar包   solrj是訪問Solr服務的java客戶端,提供索引和搜索的請求方法,SolrJ通常在嵌入在業務系統中,通過SolrJ的API接口操作Solr服務,

@Modifying 註解完成修改操作

rem transacti runt ransac soft require spring base support 以上我們做的都是查詢,那要如何實現 修改、刪除和添加呢? 可以通過以下兩種方式: (1)通過實現 CrudRepository 接口來完成(以後介紹); (

利用PBFunc在Powerbuilder中進行FTP操作

sharp uil 服務器 builder not gin 方法 targe string PBFunc.dll包含了FTP的操作,使用FTP時主要需要以下步驟: 1.調用of_Login函數登錄Ftp服務器 2.調用FTP的各種方法 3.Ftp操作完畢後調用of_L

java selenium (九) 常見web UI 元素操作API使用

清空 radio send link checkbox list select ttext lba 鏈接(link) <div> <p>鏈接 link</p> <a href="www.cn

outlook2013打開鏈接“您的組織策略組織我們完成操作

您的組織策略組織我們完成此操作 outlook 問題描述: 客戶使用了思科郵件網關,郵件網關會根據規則自動識別一些垃圾郵件,並進行隔離,郵件隔離後會以郵件形式通知到郵箱,收件人可根據需要選擇是否放行,放行後郵件會到收件人郵箱。反正,則存在郵件網關的垃圾郵件隔離區中。 有部分收件人點擊放行,

Redis(三)Redis基本命令操作API

最新 integer 朋友圈 shm ica 有序集合 object prop hashmap 一Redis 連接 Redis 連接命令主要是用於連接 redis 服務。 實例 以下實例演示了客戶端如何通過密碼驗證連接到 redis 服務,並檢測服務是否在運行: r

HDFS基本操作API

clas hello iterator 調用方法 fsd for 副本 == and 一、從hdfs下載文件到windows本地: package com.css.hdfs01; import java.io.IOException; import java.net.U

Hibernate_day02---實體類操作、物件狀態、一級快取、事務操作API

一、實體類編寫規則 1)實體類裡面屬性私有的 2)私有屬性使用公開的set和get方法操作 3)要求實體類有屬性作為唯一值(一般使用id值) 4)實體類屬性建議不使用基本資料型別,使用基本資料型別對應的包裝類 應用環境:可以解決區分出 值為零(score=0)和值不存在(

Java 8 集合之流式(Streams)操作, Streams API 詳解

因為當時公司的業務需要對集合進行各種各樣的業務邏輯操作,為了提高效能,就用到了這個東西,因為以往我們以前用集合都是需要去遍歷(序列),所以效率和效能都不是特別的好,而Streams就可以使用並行的方式來操作集合。 Stream 就如同一個迭代器(Iterator),單向,不可往復,資料只能遍歷一次,遍歷過一

利用c3p0的QueryRunner類封裝資料庫操作

文章目錄 前言 1. 準備 2. 封裝資料庫連線 3. 使用QueryRunner類,實現對資料表的 insert delete update 4. 小結 前言 鑑於最近做一個小專案,想要自己封裝資料庫操作類,但是網上的各種

PHP如何利用Python實現對PDF檔案的操作

需求:在PHP裡實現了把8.pdf的前4頁pdf檔案截取出來生成新的pdf檔案。 詳細步驟如下: 前提:python必須是3.x版本以上,必要時需要升級pip3,命令如下:pip3 install --upgrade pipPyPDF 自 2010年 12月開始就不在更新了,PyPDF2 接棒 PyPD

pandas中的多級index操作

在pandas中可以為series和dataframe設定多個index,也就是說可以有多級index和column。這樣可以對pandas的操作更加靈活。 import numpy as np import pandas as pd from pandas import Serie

理解Path對路徑進行操作API

閱讀目錄 一:理解normalize方法 二:理解join方法 三:理解dirname方法 四:理解basename方法 五:理解extname方法 回到頂部 一:理解normalize方法 該方法將非標準路徑字串轉換為標準路徑字串,在轉換過程中執行如

利用迅捷畫圖繪制精美流程圖操作方法介紹

元素 功能 基礎操作 什麽 背景 http 很多 成功 直接 流程圖在當下移動互聯網的發展中占據舉足輕重的地位,在工作學習中經常廣泛使用,那為什麽這麽受歡迎呢?雖然不能一味的模仿,但是具體操作流程框架可以更直觀的展示操作步驟,可以在基礎操作中對內容進行擴展也可以達到意想不