1.6.2 Uploading Data with Index Handlers

1.Uploading Data with Index Handlers

   索引處理器就是Request Handlers,用於添加,更新,刪除索引中的文檔.另外,使用Tika抽取富文檔數據,使用Data Import Handler抽取結構化數據.solr天然也就支持 XML, CSV 和 JSON格式的結構化文檔.java

  配置並使用request handlers的推薦的方式就是使用基於names的path,在request url中映射path--可是若是request Dispatcher配置合適以後,request handlers也能夠指定qt(query type)參數.node

2.1 The Combined UpdateRequestHandler

  聯合的UpdateRequesthandler.apache

  在solr4之後,有一個統一的update request handler的方式支持XML,CVS,JSON和javabin更新請求,受權使用ContentStreamLoader,基於ContentSream的Content-Type.json

2.2 UpdateRequestHandler配置

  默認的配置文件有更新請求處理器(update request handler)默認的配置app

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

 

2.3 XML Formatted Index Updates

  使用 Content-type: application/xml Content-type:text/xml格式能夠發送xml格式消息.dom

  添加文檔

  update handler識別xml結構的數據的方式是很直接的:curl

  •   <add>元素引入一個或者多個文檔添加到索引中
  •   <doc>元素引入組成一個文檔的字段
  •   <field>元素表明了一個字段的內容

例子:性能

<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" boost="2.0">Summer of the all-rounder: Test and
            championship
            cricket in England 1982</field>
        <field name="isbn">0002166313</field>
        <field name="yearpub">1982</field>
        <field name="publisher">Collins</field>
    </doc>
    <doc boost="2.5">
        ...
    </doc>
</add>

 

  每個元素都有一些能夠指定的屬性:優化

命令 參數 參數描述
<add> commitWithin=number 在指定的毫秒數中添加文檔
<add> overwrite=boolean 默認爲ture
<doc> boost=float 默認爲1.0 設置文檔的權值
<field> boost=float 默認爲1.0  設置字段的權值

  Commit and Optimize Operations

   <commit>操做是將自從上次提交以後的全部文檔寫入到硬盤上.在提交以前,新的文檔對搜素是不可見的,提交操做打開了一個新的searcher,觸發任何配置的監聽事件.ui

   提交操做能夠經過<commit/>來發布.也能夠經過solrconfig.xml中的<autocommit>來觸發.

  <optimize>操做要求solr合併內部數據以提升查詢性能.對於大索引,合併將會花費一部分時間.若是使用solr的複製(replication)機制跨多個系統分發搜索,注意在作一個優化操做以後,一個完整的索引被傳遞.

  <commit> 和<optimize>的屬性:

屬性 描述
maxSegments 默認爲1,索引優化的片斷不能超過這個值
waitFlush 默認爲true,阻塞直到索引起生變化,沖刷到磁盤上.
waitSearcher 默認爲true,阻塞,直到打開一個新的searcher,並註冊爲主查詢searcher.使這個改變可視的.
expungeDeletes 默認爲false,合併片斷,刪除刪除的文檔.

這裏是一個提交和優化的例子:

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

 

  Delete Operations

  刪除文檔有兩種方式:按照ID刪除和按照query刪除.不過若是是經過query刪除,commitWithin會被忽略.一個刪除消息中能夠刪除多個文檔:

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

 

  Rollback Operations

  回滾操做恢復從上一次提交以後的全部增長,刪除的數據.它既不調用任何監聽事件又不建立新的searcher.它的語法簡單<rollback/>

  Using curl  to Perform Updates with the Update Request Handler

  可使用--data-binary 選項來添加xml消息到curl命令中,生成一個HTTP POST請求.例如:

curl http://localhost:8983/update -H "Content-Type: text/xml" --data-binary 
'
<add>
    <doc>
        <field name="authors">Patrick Eagar</field>
        <field name="subject">Sports</field>
        <field name="dd">796.35</field>
        <field name="isbn">0002166313</field>
        <field name="yearpub">1982</field>
        <field name="publisher">Collins</field>
    </doc>
</add>
'

 

  對於發送一個包含XML消息的文件,可使用:

curl http://localhost:8983/update -H "Content-Type: text/xml" --data-binary
@myfile.xml

 

  簡短的請求能夠經過HTTP GET命令,URL-編碼這個請求,注意"<" 和">"的轉義:

curl http://localhost:8983/update?stream.body=%3Ccommit/%3E

 

  solr響應:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">127</int>
    </lst>
</response>

 

  若是失敗,狀態字段status非0.

2.4 Using XSLT to Transform XML Index Updates

  UpdateRequestHandler容許索引任意的XML.使用<tr>參數用於XSLT transformation  .你必須在solr/conf/xslt目錄下有一個樣式表.能夠轉換數據成指望的  format, <add><doc/></add>格式,而且使用tr參數指定樣式表的名稱.

  這是一個XSLT樣式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <add> <xsl:apply-templates select="/random/document" /> </add> </xsl:template> <xsl:template match="document"> <doc boost="5.5"> <xsl:apply-templates select="*" /> </doc> </xsl:template> <xsl:template match="node"> <field name="{@name}"> <xsl:if test="@enhance!=''"> <xsl:attribute name="boost"><xsl:value-of select="@enhance" /></xsl:attribute> </xsl:if> <xsl:value-of select="@value" /> </field> </xsl:template> </xsl:stylesheet>

   這個樣式表將solr的XML搜索結果格式轉換成Solr的更新XML語法.一個例子就是複製solr1.3的索引(沒有CVS響應writer)到一個能夠被索引到另一個solr文件的格式(提供全部字段的存儲).

http://localhost:8983/solr/select?q=*:*&wt=xslt&tr=updateXml.xsl&rows=1000

 

  在更新的時候,你也可使用XsltUpdateRequestHandler的樣式表來轉換索引:

curl "http://localhost:8983/solr/update?commit=true&tr=updateXml.xsl" -H
"Content-Type: text/xml" --data-binary @myexporteddata.xml

 

  更多關於XML Update Request Handler的信息,參考. https://wiki.apache.org/solr/UpdateXmlMessages.

2.5 JSON Formated Index Updates

  JSON格式的更新請求,須要發送/update的句柄,使用Content-Type: application/json或者Content-Type: text/json.

  默認配置:

<requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler">
    <lst name="defaults">
        <str name="stream.contentType">application/json</str>
    </lst>
</requestHandler>

 

  例子:

  有一個JSON文件在example/exampledocs/books.json,能夠添加文檔到solr的服務中:

cd example/exampledocs
curl 'http://localhost:8983/solr/update/json?commit=true'
--data-binary @books.json -H 'Content-type:application/json'

 

  URL中添加 commit=true,使文檔當即能夠搜索.

Update Commands

  JSON的更新處理器(handler)接受全部的更新命令.一個消息中能夠包含多個命令:

{
"add": {
  "doc": {
    "id": "DOC1",
    "my_boosted_field": { /* use a map with boost/value for a boosted field */
      "boost": 2.3,
      "value": "test"
    },
    "my_multivalued_field": [ "aaa", "bbb" ] /* use an array for a multi-valued field */
  }
},
"add": {
  "commitWithin": 5000, /* commit this document within 5 seconds */
  "overwrite": false, /* don't check for existing documents with the same uniqueKey */
  "boost": 3.45, /* a document boost */
  "doc": {
    "f1": "v1",
    "f1": "v2"
  }
},
"commit": {},
"optimize": {
  "waitFlush":false, "waitSearcher":false },
  "delete": { "id":"ID" }, /* delete by ID */
  "delete": { "query":"QUERY" } /* delete by query */
}

 

注意:json中是不容許註釋的.

正如其餘update handler同樣,  commit, commitWithin, optimize,overwrite也能夠在URL中指定.

"delete":"myid"

 

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

 

更多 JSON Update Request Handler的相關信息,參考 https://wiki.apache.org/solr/UpdateJSON.

2.6 CSV Formated Index Updates

  CVS格式請求能夠發送/update 句柄,使用Content-Type: application/csv或者Content-Type: text/csv.

默認配置:

<requestHandler name="/update/csv" class="solr.CSVRequestHandler">
    <lst name="defaults">
        <str name="stream.contentType">application/csv</str>
    </lst>
</requestHandler>
相關文章
相關標籤/搜索