Solr系列四:Solr(solrj 、索引API 、 結構化數據導入)


一、SolrJ介紹

1. SolrJ是什么?

Solr提供的用於JAVA應用中訪問solr服務API的客戶端jar。在我們的應用中引入solrj:

<dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>7.3.0</version>
</dependency>

2. SolrJ的核心API

SolrClient

SolrRequest

SolrResponse

3. SolrClient 的子類

HttpSolrClient – 與指定的一個solr節點通信的客戶端

LBHttpSolrClient –負載均衡地訪問一組節點的客戶端

CloudSolrClient – 訪問solrCloud的客戶端

ConcurrentUpdateSolrClient –並發更新索引用的客戶端

4. 創建客戶端時通用的配置選項

4.1 Base URL:

http://hostname:8983/solr/core1

http://hostname:8983/solr

4.2 Timeouts

final String solrUrl = "http://localhost:8983/solr";
return new HttpSolrClient.Builder(solrUrl)
    .withConnectionTimeout(10000)
    .withSocketTimeout(60000)
    .build();

5. 用SolrJ索引文檔

//獲取solr客戶端
final SolrClient client = getSolrClient();

//創建一個solr文檔doc添加字段值
final SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "Amazon Kindle Paperwhite");

//把solr文檔doc通過客戶端提交到內核techproducts中去
final UpdateResponse updateResponse = client.add("techproducts", doc); 

// 索引文檔必須被提交
client.commit("techproducts");

6. 用SolrJ查詢

//獲取solr客戶端
final SolrClient client = getSolrClient();
//創建查詢的map參數
final Map<String, String> queryParamMap = new HashMap<String, String>();
queryParamMap.put("q", "*:*");
queryParamMap.put("fl", "id, name");
queryParamMap.put("sort", "id asc");
//把查詢的map參數放到MapSolrParams里面去
MapSolrParams queryParams = new MapSolrParams(queryParamMap); 
//通過客戶端用查詢參數queryParams去內核techproducts里面查詢數據
final QueryResponse response = client.query("techproducts", queryParams); 
//從響應結果里面獲取查詢的document
final SolrDocumentList documents = response.getResults(); 
out("Found " + documents.getNumFound() + " documents"); 
//遍歷document取出結果
for(SolrDocument document : documents) {
  final String id = (String) document.getFirstValue("id");
  final String name = (String) document.getFirstValue("name");

  out("id: " + id + "; name: " + name);
}

7. Java 對象綁定

public static class TechProduct {
  @Field public String id;
  @Field public String name;

  public TechProduct(String id, String name) {
    this.id = id;  this.name = name;
  }

  public TechProduct() {}
}

索引:

final SolrClient client = getSolrClient();

final TechProduct kindle = new TechProduct("kindle-id-4", "Amazon Kindle Paperwhite");
final UpdateResponse response = client.addBean("techproducts", kindle);

client.commit("techproducts");

查詢:

final SolrClient client = getSolrClient();

final SolrQuery query = new SolrQuery("*:*");
query.addField("id");
query.addField("name");
query.setSort("id", ORDER.asc);

final QueryResponse response = client.query("techproducts", query);
final List<TechProduct> products = response.getBeans(TechProduct.class);

8.詳細API介紹

SolrClient的API

SolrRequest 的API

SolrRequest 的子類

 

SolrResponse 的API

 

SolrResponse 的子類

 

 

 9. 示例代碼

package com.dongnao.solr.demo.client;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;

public class SolrJClientDemo {

    // baseSolrUrl 示例
    private static String baseSolrUrl = "http://localhost:8983/solr/";
    private static String baseSolrUrlWithCollection = "http://localhost:8983/solr/techproducts";

    /**
     * HttpSolrClient:與一個solr Server 通過http進行通信
     */
    public static SolrClient getHttpSolrClient(String baseSolrUrl) {
        return new HttpSolrClient.Builder(baseSolrUrl)
                .withConnectionTimeout(1000).withSocketTimeout(6000).build();
    }

    public static SolrClient getHttpSolrClient() {
        return new HttpSolrClient.Builder(baseSolrUrl)
                .withConnectionTimeout(1000).withSocketTimeout(6000).build();
    }

    /**
     * LBHttpSolrClient: 負載均衡的httpSolrClient <br>
     * 負載均衡方式: 輪詢給定的多個solr server url。
     * 當某個url不通時,url地址會從活躍列表移到死亡列表中,用下一個地址再次發送請求。<br>
     * 對於死亡列表中的url地址,會定期(默認每隔1分鍾,可設置)去檢測是否變活了,再加入到活躍列表中。 <br>
     * 注意: <br>
     * 1、不可用於主從結構master/slave 的索引場景,因為主從結構必須通過主節點來更新。 <br>
     * 2、對於SolrCloud(leader/replica),使用CloudSolrClient更好。
     * 在solrCloud中可用它來進行索引更新,solrCloud中的節點會將請求轉發到對應的leader。
     */
    public static SolrClient getLBHttpSolrClient(String... solrUrls) {
        return new LBHttpSolrClient.Builder().withBaseSolrUrls(solrUrls)
                .build();
    }

    private static String baseSolrUrl2 = "http://localhost:7001/solr/";

    public static SolrClient getLBHttpSolrClient() {
        return new LBHttpSolrClient.Builder()
                .withBaseSolrUrls(baseSolrUrl, baseSolrUrl2).build();
    }

    /**
     * 訪問SolrCloud集群用CloudSolrClient<br>
     * CloudSolrClient 實例通過訪問zookeeper得到集群中集合的節點列表,<br>
     * 然后通過LBHttpSolrClient來負載均衡地發送請求。<br>
     * 注意:這個類默認文檔的唯一鍵字段為“id”,如果不是的,通過 setIdField(String)方法指定。
     */
    public static SolrClient getCloudSolrClient(List<String> zkHosts,
            Optional<String> zkChroot) {
        return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
    }

    private static String zkServerUrl = "localhost:9983";

    public static SolrClient getCloudSolrClient() {
        List<String> zkHosts = new ArrayList<String>();
        zkHosts.add(zkServerUrl);
        Optional<String> zkChroot = Optional.empty();
        return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
    }

    public static void main(String[] args) throws Exception {

        // HttpSolrClient 示例:
        SolrClient client = SolrJClientDemo.getHttpSolrClient();

        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", UUID.randomUUID().toString());
        doc.addField("name", "HttpSolrClient");

        UpdateResponse updateResponse = client.add("techproducts", doc);
        // 記得要提交
        client.commit("techproducts");

        System.out.println("------------ HttpSolrClient ------------");
        System.out.println("add doc:" + doc);
        System.out.println("response: " + updateResponse.getResponse());

        client.close();

        // LBHttpSolrClient 示例
        client = SolrJClientDemo.getLBHttpSolrClient();
        doc.clear();
        doc.addField("id", UUID.randomUUID().toString());
        doc.addField("name", "LBHttpSolrClient");

        updateResponse = client.add("techproducts", doc);
        // 記得要提交
        client.commit("techproducts");
        System.out.println("------------ LBHttpSolrClient ------------");
        System.out.println("add doc:" + doc);
        System.out.println("response: " + updateResponse.getResponse());

        client.close();

        // CloudSolrClient 示例
        client = SolrJClientDemo.getCloudSolrClient();
        doc.clear();
        doc.addField("id", UUID.randomUUID().toString());
        doc.addField("name", "CloudSolrClient");

        updateResponse = client.add("techproducts", doc);
        // 記得要提交
        client.commit("techproducts");
        System.out.println("------------ CloudSolrClient ------------");
        System.out.println("add doc:" + doc);
        System.out.println("response: " + updateResponse.getResponse());

        client.close();
    }

}

二、索引 API 詳解

1. Solr提供的數據提交方式簡介

Solr中數據提交進行索引都是通過http請求,針對不同的數據源solr提供了幾種方式來方便提交數據。

1.1 基於Apache Tika 的 solr cell(Solr Content Extraction Library ),來提取上傳文件內容進行索引。

1.2 應用中通過Index handler(即 index API)來提交數據。

1.3 通過Data Import Handler 來提交結構化數據源的數據

2. Index handler 是什么?

Index handler 索引處理器,是一種Request handler 請求處理器。

solr對外提供http服務,每類服務在solr中都有對應的request handler來接收處理,solr中提供了默認的處理器實現,如有需要我們也可提供我們的擴展實現,並在conf/solrconfig.xml中進行配置。

在 conf/solrconfig.xml中,requestHandler的配置就像我們在web.xml中配置servlet-mapping(或spring mvc 中配置controller 的requestMap)一樣:配置該集合/內核下某個請求地址的處理類。

Solrconfig中通過updateHandler元素配置了一個統一的更新請求處理器支持XML、CSV、JSON和javabean更新請求(映射地址為/update),它根據請求提交內容流的內容類型Content-Type將其委托給適當的ContentStreamLoader來解析內容,再進行索引更新。

3. 配置一個requestHandler示例

<requestHandler name=“/update" class="solr.UpdateRequestHandler" /> 

4. Xml 格式數據索引更新

提交操作可以在solr的web控制台中進行

請求頭中設置 Content-type: application/xml or Content-type: text/xml

4.1 添加、替換文檔

<add> 操作,支持兩個可選屬性:

commitWithin:限定在多少毫秒內完成

overwrite:指定當唯一鍵已存在時是否覆蓋,默認true。

<add>
  <doc>
    <field name="authors">Patrick Eagar</field>
    <field name="subject">Sports</field>
    <field name="dd">796.35</field>
    <field name="numpages">128</field>
    <field name="desc"></field>
    <field name="price">12.40</field>
    <field name="title">Summer of the all-rounder</field>
    <field name="isbn">0002166313</field>
    <field name="yearpub">1982</field>
    <field name="publisher">Collins</field>
  </doc>
  <doc>
  ...
  </doc>
</add>

4.2 刪除文檔

<delete>
  <id>0002166313</id>
  <id>0031745983</id>
  <query>subject:sport</query>
  <query>publisher:penguin</query>
</delete>

<delete> 操作,支持兩種刪除方式:

1、根據唯一鍵

2、根據查詢

4.3 組合操作

添加和刪除文檔

<update>
  <add>
    <doc><!-- doc 1 content --></doc>
  </add>
  <add>
    <doc><!-- doc 2 content --></doc>
  </add>
  <delete>
    <id>0002166313</id>
  </delete>
</update>

響應結果:Status=0表示成功 Qtime是耗時

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">127</int>
  </lst>
</response>

4.4 提交、優化、回滾操作

<commit waitSearcher="false"/>
<commit waitSearcher="false" expungeDeletes="true"/>
<optimize waitSearcher="false"/>
<rollback/>

commit、optimize 屬性說明:

waitSearcher:默認true,阻塞等待打開一個新的IndexSearcher並注冊為主查詢searcher,來讓提交的改變可見。

expungeDeletes: (commit only) 默認false,合並刪除文檔量占比超過10%的段,合並過程中刪除這些已刪除的文檔。

maxSegments: (optimize only) 默認1,優化時,將段合並為最多多少個段

5. JSON 格式數據索引更新

提交操作可以在solr的web控制台中進行

請求頭中設置 Content-Type: application/json or Content-Type: text/json

5.1 添加、替換一個文檔

{
  "id": "1",
  "title": "Doc 1"
}

5.2 添加、替換多個文檔

[
  {
    "id": "1",
    "title": "Doc 1"
  },
  {
    "id": "2",
    "title": "Doc 2"
  }
]

 

5.3 在json中指定操作

{
  "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" } 
}

5.4 根據唯一鍵刪除的簡寫方式

{ "delete":"myid" }

{ "delete":["id1","id2"] }

5.5 針對 JSON 格式數據提供的兩個專用path

不需要在請求頭中設置 Content-Type: application/json or Content-Type: text/json

/update/json

/update/json/docs 專門用於提交json格式的文檔 如:product.json

三、結構化數據導入DIH

1. Solr結構化數據導入簡介

Solr支持從關系數據庫、基於http的數據源(如RSS和ATOM提要)、電子郵件存儲庫和結構化XML 中索引內容。

 我們如何觸發solr進行數據導入?

1.1 需要在solrconfig.xml配置一個requestHandler,通過發出http請求來觸發,這個requestHander稱為Data import Handler (DIH)

<requestHandler name="/dataimport" class="solr.DataImportHandler">
  <lst name="defaults">
    <str name="config">/path/to/my/DIHconfigfile.xml</str>
  </lst>
</requestHandler>

DataImportHandler這個類所在jar並沒有包含在類目錄中,我們需要在solrconfig.xml中引入這個jar; 它還需要一個配置文件

1.2 在solrconfig.xml中引入DataImportHandler的jar

在solrconfig.xml中找到<lib>的部分,加入下面的

<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />

 solr接到請求后,它如何知道該從何處取什么數據進行索引?

 這就需要一個配置文件來定義這些了:

<requestHandler name="/dataimport" class="solr.DataImportHandler">
  <lst name="defaults">
    <str name="config">dih-data-config.xml</str>
  </lst>
</requestHandler>

 配置文件可以是絕對路徑、或相對集合conf/的相對路徑。

 2. DIH 核心概念

 

字段對應規則說明:

1、自動進行名字相同配對;

2、對於名字不同的通過顯式配置 field的column、name屬性指定

配置示例:

在solr安裝目錄中的example/example-DIH/solr/ 下可以看到好幾個導入示例

1、請查看各示例的solrconfig.xml中通過<lib>導入了哪些數據導入相關的jar。

2、請查看各示例的DIH配置文件的定義。

3、請重點看看從關系數據庫導入的示例。

 

練習:從關系數據庫導入數據到solr實踐

 數據庫:mysql

 表結構如下:

//商品表
create table t_product(
    prod_id    varchar(64) PRIMARY key,
    name     varchar(200)    not null,
    simple_intro LONGTEXT,
    price bigint,
    uptime datetime,
    brand_id varchar(64),
    last_modify_time datetime
);
//商品的品牌表
create table t_brand(
    id varchar(64) PRIMARY key,
    name varchar(200) not null,
    last_modify_time datetime
);
//商品的種類表
create table t_cat(
    id varchar(64) PRIMARY key,
    name varchar(200) not null,
    last_modify_time datetime
);
//商品和商品種類的關系映射表
create table t_prod_cat(
    prod_id varchar(64),
    cat_id    varchar(64) ,
    last_modify_time datetime
);
//初始化數據
INSERT INTO t_brand VALUES ('b01', '華為', '2018-5-17 00:00:00');
INSERT INTO t_brand VALUES ('b02', '戴爾', '2018-5-18 00:00:00');

INSERT INTO t_cat VALUES ('c01', '台式機', '2018-5-17 00:00:00');
INSERT INTO t_cat VALUES ('c02', '服務器', '2018-5-17 00:00:00');

INSERT INTO t_product VALUES ('tp001', '華為(HUAWEI)RH2288HV3服務器', '12盤(2*E5-2630V4 ,4*16GB ,SR430 1G,8*2TSATA,4*GE,2*460W電源,滑軌) ', 4699900, '2018-5-8 00:00:00', 'b01', '2018-5-8 00:00:00');
INSERT INTO t_product VALUES ('tp002', '戴爾 DELL R730 2U機架式服務器', '戴爾 DELL R730 2U機架式服務器(E5-2620V4*2/16G*2/2T SAS*2熱/H730-1G緩存/DVDRW/750W雙電/導軌)三年', 2439900, '2018-5-18 15:32:13', 'b02', '2018-5-18 17:32:23');

INSERT INTO t_prod_cat VALUES ('tp001', 'c01', '2018-5-8 14:48:56');
INSERT INTO t_prod_cat VALUES ('tp001', 'c02', '2018-5-8 14:49:15');
INSERT INTO t_prod_cat VALUES ('tp002', 'c01', '2018-5-18 15:32:48');
INSERT INTO t_prod_cat VALUES ('tp002', 'c02', '2018-5-18 18:29:23');

前期准備:

1、創建一個集合或內核 myproducts,配置集用 _default。

D:\solr-7.3.0\bin>solr.cmd create -c myproducts -d _default -p 8983

2、為myproducts添加如下字段定義(分詞的要用中文分詞器)。

2.1 在myproducts的D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema模式文件下配置中文分詞器

  <!-- 自定義中文分詞器 begin -->
  <fieldType name="ik_zh_CN" class="solr.TextField">
    <analyzer>
      <tokenizer class="com.study.lucene.demo.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true"/>
    </analyzer>
  </fieldType>
  <!-- 自定義中文分詞器 end -->

2.2 在myproducts的D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema模式文件下配置如下字段

prodId:商品id,字符串,索引、存儲;
name: 商品名稱,字符串,分詞、索引、存儲
simpleIntro:商品簡介,字符串,分詞、索引、不存儲
price:價格,整數(單位分),索引,存儲
uptime:上架時間,索引、docValues  支持排序
brand:品牌,不分詞、索引、docValues 支持分面查詢
cat:分類,多值,不分詞、索引、docValues
  <field name="prodId" type="string" indexed="true" stored="true" required="true" multiValued="false"  />
  <field name="name" type="ik_zh_CN" indexed="true" stored="true" required="true" />
  <field name="simpleIntro" type="ik_zh_CN" indexed="true" stored="flase" />
  <field name="price" type="pint" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" />
  <field name="uptime" type="pdate" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" />
  <field name="brand" type="string" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" />
  <field name="cat" type="strings" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" />

3、將myproducts模式(D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema)的唯一鍵字段設為 prodId。

<uniqueKey>prodId</uniqueKey>

從新加載內核myproducts可以看到配置生效了

 

 從關系數據庫導入實踐-步驟

1. 拷貝mysql的驅動jar包mysql-connector-java-5.1.34_1.jar到solrD:\solr-7.3.0\server\solr-webapp\webapp\WEB-INF\lib目錄下

2. 在myproducts集合的solrconfig.xml中配置<lib>和DIH

2.1 配置lib

 <!--導入mysql結構化數據需要的lib包 begin -->
   <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
   <!--導入mysql結構化數據需要的lib包 end -->

2.2 配置DIH

<!--導入mysql結構化數據需要的DIH begin -->
   <requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
  <!--導入mysql結構化數據需要的DIH end -->

3. 在myproducts集合的conf/目錄下創建dih配置文件db-data-config.xml

3.1  配置數據源

 單數據源

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>

 多數據源

<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/>
<dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>

 說明:

(1) . name、type 是通用屬性,type默認是jdbcDataSource

(2)  其他屬性是非固定的,不同type可有不同的屬性,可隨意擴展。

<dataSource driver="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://127.0.0.1:3306/study?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT" 
        user="root" password="123456" />

說明: serverTimezone=GMT是為解決引入最新版mysql驅動jar報時區錯誤而加入的連接請求參數。

3.2 . 配置document對應的實體(導入的數據)。

<document> 下可包含一個或多個 <entity>數據實體

entity 數據實體通用屬性說明

name (required) : 標識實體的唯一名
processor : 當數據源是非RDBMS 時,必須指定處理器。(默認是SqlEntityProcessor)
transformer : 要應用在該實體上的轉換器。
dataSource : 當配置了多個數據源時,指定使用的數據源的名字。
pk : 實體的主鍵列名。只有在增量導入時才需要指定主鍵列名。和模式中的唯一鍵是兩個不同的東西。
rootEntity : 默認document元素的子entity是rootEntity,如果把rootEntity屬性設為false值,則它的子會被作為rootEntity(依次類推)。rootEntity返回的每一行會創建一個document。
onError : (abort|skip|continue) . 當處理entity的行為document的過程中發生異常該如何處理:默認是 abort,放棄導入。skip:跳過這個文檔,continue:繼續索引該文檔。
preImportDeleteQuery : 在全量導入前,如需要進行索引清理cleanup,可以通過此屬性指定一個清理的索引刪除查詢,否則用的是‘*:*’(刪除所有)。只有<document>的直接子Entity設置此屬性有效。
postImportDeleteQuery : 指定全量導入后需要進行索引清理的delete查詢。只有<document>的直接子Entity設置此屬性有效.

 SqlEntityProcessor 的 entity 屬性說明

query (required) : 從數據庫中加載實體數據用的SQL語句。
deltaQuery : 僅用於增量導入,指定增量數據pk的查詢SQL。
parentDeltaQuery : 指定增量關聯父實體的pk的查詢SQL。
deletedPkQuery :僅用於增量導入,被刪除實體的pk查詢SQL。
deltaImportQuery : (僅用於增量導入) .指定增量導入實體數據的查詢SQL。如果沒有指定該查詢語句,solr將使用query屬性指定的語句,經修改后來查詢加載增量數據(這很容易出錯)。在該語句中往往需要引用deltaQuery查詢結果的列值,
            通過 ${dih.delta.
<column-name>} 來引用,如:select * from tbl where id=${dih.delta.id}

3.3. 在實體的query屬性里面配置查詢數據的SQL

7. 配置獲取關聯表數據

 entity 關系表示

實體關系(一對一、一對多、多對一、多對多),用子實體來表示,在子實體的SQL查詢語句中可用${parentEntity.columnName}來引用父實體數據的列值。

一個實體可包含多個子實體。

 配置完的db-data-config.xml最終內容如下:

<dataConfig>
   <!--配置數據源 -->
    <dataSource driver="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://127.0.0.1:3306/study?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT" 
        user="root" password="123456" />
    <document>
    <!--配置document對應的實體(導入的數據) 配置查詢數據的SQL(這里偷了一下懶,用一個sql查出了需要的數據,實際上還可以通過配置子實體關聯到需要的數據)-->
        <entity name="item" pk="prodId" query="SELECT
    tp.prod_id prodId,tp.name prodname,tp.simple_intro simpleIntro,tp.price,tp.uptime,tb.name brand,tc.name cat
FROM t_product tp LEFT JOIN t_brand tb ON tp.brand_id = tb.id LEFT JOIN t_prod_cat tpc ON tp.prod_id = tpc.prod_id INNER JOIN t_cat tc ON cat_id = tc.id GROUP BY tp.prod_id">
            <!--配置sql查詢的列和模式里面定義字段的對應關系 begin -->
            <field column="prodId" name="prodId" />
            <field column="prodname" name="name" />
            <field column="simpleIntro" name="simpleIntro" />
            <field column="price" name="price" />
            <field column="uptime" name="uptime" />
            <field column="brand" name="brand" />
            <field column="cat" name="cat" />
            <!--配置sql查詢的列和模式里面定義字段的對應關系 end -->
         
        </entity>
    </document>
</dataConfig>

 

8.在solr的web控制台從新加載集合myproducts以后執行同步,可以看到數據庫的數據已經成功導入到solr里面來了

 

3. 增量導入中的特殊變量${dataimporter.last_index_time} 說明

這個變量是上次導入的開始時間。默認存儲在conf/請求處理器名.properties文件中。我們可以在<dataConfig>下配置一個propertyWriter元素來設置它。

<propertyWriter dateFormat="yyyy-MM-dd HH:mm:ss" type="SimplePropertiesWriter" directory="data" filename="dataimport.properties" locale="en_US" />

 

說明:type在非cloud模式下默認是SimplePropertiesWriter,在cloud模式下默認是ZKPropertiesWriter

4. DIH配置文件中使用請求參數

如果你的DIH配置文件中需要使用請求時傳人的參數,可用${dataimporter.request.paramname}表示引用請求參數。

配置示例:

<dataSource driver="org.hsqldb.jdbcDriver" url="${dataimporter.request.jdbcurl}" user="${dataimporter.request.jdbcuser}" password="${dataimporter.request.jdbcpassword}" />

請求傳參示例:

http://localhost:8983/solr/dih/dataimport?command=full-import&jdbcurl=jdbc:hsqldb:./example-DIH/hsqldb/ex&jdbcuser=sa&jdbcpassword=secret

四、總結

1. Solr支持從很多種數據源導入數據

2. 實現了很多的處理器及轉換器

3. 實際工作過程中如碰到了別的數據源的導入,一定要想到solr中應該有對應的解決方案。參考地址:

http://lucene.apache.org/solr/guide/7_3/uploading-structured-data-store-data-with-the-data-import-handler.html

https://wiki.apache.org/solr/DataImportHandle

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM