Solrインデックス更新-JSON、CSV

8958 ワード


Solrインデックス更新-JSON、CSV
 
前節では、solr更新データのフォーマットと、XMLフォーマットのフィールドについてXMLフォーマットで説明しました.これらのフィールドにより、solrのドキュメントに対するインデックス機能をうまく制御できます.
 
XMLフォーマットのみで更新すると、ドキュメントの内容をより詳細に操作できますが、フォーマットが複雑すぎて、現在はjsonフォーマットが流行しています.フォーマットが簡単で、内容がはっきりしています.solrは3.1バージョンでjsonフォーマットのインデックス更新をサポートしています.
     
でもsolr 4.0以降は、UpdateRequestHandlerを直接使用できますが、リクエストヘッダにContent-type:application/jsonまたはContent-type:text/jsonフィールドを追加し、更新方法がjson形式インデックスであることを通知する必要があります.
 
jsonフォーマットに疑問があれば、この文章を読むことができます:http://isilic.iteye.com/blog/1747660
 
curlコマンドを使用するには:
curl 'http://localhost:8983/solr/update/json?commit=true' --data-binary @books.json -H 'Content-type:application/json'
このうち、data-binaryフィールドの後ろに提出されたデータは@で始まり、これは提出された内容がローカルファイルであることを示し、ローカルファイルの内容を提出します.これはこの文章http://isilic.iteye.com/blog/1764049で言及されていますが、あまり言っていません.ここでは単独で提出しますが、他のcurl提出パラメータには違いはありません.
 
 
その中でbooks.jsonはexample/exampledocsディレクトリの下にあり、一部の内容は以下の通りです.
 
[
  {
    "id" : "978-0641723445",
    "cat" : ["book","hardcover"],
    "name" : "The Lightning Thief",
    "author" : "Rick Riordan",
    "series_t" : "Percy Jackson and the Olympians",
    "sequence_i" : 1,
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 12.50,
    "pages_i" : 384
  }
,
  {
    "id" : "978-1423103349",
    "cat" : ["book","paperback"],
    "name" : "The Sea of Monsters",
    "author" : "Rick Riordan",
    "series_t" : "Percy Jackson and the Olympians",
    "sequence_i" : 2,
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 6.49,
    "pages_i" : 304
  },
  {},
  {}
]
 
 
これは説明しなくてもいいでしょう.XML形式の変換です.これらのデータを提出すると、solrに新しいインデックスを通知することができます.
いくつかのフィールドの接尾辞に注意してください.i,_t,これらの接尾辞には特別な意味があり,次のDIHについて説明するときにこの部分がある.
 
複数のドキュメントを操作し、複数のドキュメントを異なる制御する必要がある場合は、以下のより複雑なjsonフォーマットが必要です.実はフォーマットが少し複雑で、内容はXMLと全く同じです.
 
 
{ 
"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 */
"delete": { "query":"QUERY", 'commitWithin':'500' }    /* delete by query, commit within 500ms */
}

 
 
これらのフィールドの意味は、前のXML形式で紹介されていますが、これは説明されていません.
 
Solr 4.0では、Solrは、以下のようにincフィールドのサポートを増やすAtomic Update方式を提供します.
 
curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
 {
  "id"        : "TestDoc1",
  "title"     : {"set":"test1"},
  "revision"  : {"inc":3},
  "publisher" : {"add":"TestPublisher"}
 }'
 
 
実際に内蔵されている_version_フィールドはfieldドメインの原子更新操作をサポートし、実際にはフィールドのinc属性です.これはjsonフォーマット特有でしょう.
 
curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
 {
  "id"        : "TestDoc1",
  "title"     : {"set":"test1"},
  "revision"  : {"inc":3},
  "publisher" : {"add":"TestPublisher"}
  "_version_" : {12345}
 }'
 
 
実は最後にこれversion_Optimisticと呼ばれるものを提供するためにsolrが独自に追加しましたConcurrency http://wiki.apache.org/solr/Optimistic_Concurrencyの操作、これは私が見て、特にはっきり見ていないで、多く言う勇気がなくて、みんなは自分で理解することができて、もしこの機能が必要ならば.
 
 
 
最後に、CSV形式でドキュメントインデックスを更新し、CSV形式でsolr 1を更新することを学びます.2は既にサポートされていますが、csv形式は比較的簡単で、実際には使用時に制限が大きいため、ここではCSV分割のデータをいつ使用するかを簡単に紹介します.要求データのフォーマットが簡単で、フィールドの制御が複雑ではないときに使用されますが、私はこれが歴史的な産物であることに偏っています.特にフォーマットが豊富な年代では、家族の言葉です.
 
CSV形式で索引更新を提出するにはsolrconfig.xmlで追加
 
<requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy"></requestHandler>

solr 4.0では、これをそのまま使えます
 
<requestHandler name="/update" class="solr.UpdateRequestHandler"/>

ただし、ヘッダにContent-type:アプリケーション/csvまたはContent-type:text/csvを追加する必要があります.これはXML、JSONと同じです.
 
 
CSV-Comma Separated Valueは、カンマで分割されたもので、solrにcsv形式のデータをコミットしたい場合はcurlコマンドを使用してコミットできます.
 
curl http://localhost:8983/solr/update/csv --data-binary @books.csv -H 'Content-type:text/plain; charset=utf-8'
 
 
books.csvはexample/exampledocsディレクトリの下にあります.その内容は次のとおりです.
 
id,cat,name,price,inStock,author,series_t,sequence_i,genre_s
0553573403,book,A Game of Thrones,7.99,true,George R.R. Martin,"A Song of Ice and Fire",1,fantasy
0553579908,book,A Clash of Kings,7.99,true,George R.R. Martin,"A Song of Ice and Fire",2,fantasy
055357342X,book,A Storm of Swords,7.99,true,George R.R. Martin,"A Song of Ice and Fire",3,fantasy
0553293354,book,Foundation,7.99,true,Isaac Asimov,Foundation Novels,1,scifi
0812521390,book,The Black Company,6.99,false,Glen Cook,The Chronicles of The Black Company,1,fantasy
0812550706,book,Ender's Game,6.99,true,Orson Scott Card,Ender,1,scifi
0441385532,book,Jhereg,7.95,false,Steven Brust,Vlad Taltos,1,fantasy
0380014300,book,Nine Princes In Amber,6.99,true,Roger Zelazny,the Chronicles of Amber,1,fantasy
0805080481,book,The Book of Three,5.99,true,Lloyd Alexander,The Chronicles of Prydain,1,fantasy
080508049X,book,The Black Cauldron,5.99,true,Lloyd Alexander,The Chronicles of Prydain,2,fantasy
 
 
このフォーマットに対するsolrのサポートパラメータを簡単に説明します.
 
separator:   ,          ,   comma
header:      
skip:      

fieldnames=id,name,category&skip=name
      name    :
fieldnames=id,,category

skipLines:  csv     ,   skipLines=0
trim:                   
encapsulator:              ,        ,      ,      "
escape:      ,      encapsulator      。

keepEmpty:  field   ,      Zero  ,      ,   false
literal:              
literal.datasource=products:         datasource=product    
map:     ,  LHS     RHS  
map=Absolutely:true        , Absolutely       true  
split:   true  ,      comma  ,     ,     
id,tags
101,"movie,spiderman,action"
    tags      ,      3   tag ,  tags=movie、tags=spiderman、tags=action
overwrite:                ,   true
commit:            ,     ;   false,              。

 
 
CSVの欠点はインデックスのboostオプションを設定できないことです.この特性を使用したい場合は、CSVはあなたの選択ではないかもしれません.
 
最後に、CSVフォーマットは他のフォーマットで分割されたファイルを提供することもできます.commaだけでなく、Tabキーで分割するなど、mysqlでは:
 
 
select * into outfile '/tmp/result.txt' from tmptable

注:このコマンドの実行には権限の問題があります.皆さんは自分で解決することができます.
これによりTabキー分割のデータが得られ,solrをコミットする際にseparatorを設定すればインデックスをコミットできる.
 
全体的に見ると、XMLフォーマットとJSONフォーマットが主流で、もしあなたのデータフォーマットがちょうどCSVフォーマットに変換できるならば、CSVを使うことができて、さもなくばやはりXMLあるいはJSONを使って、あなたにもっと良い制御をあげます.