Apakah mungkin memuat file teks, apa pun isinya, sebagai dokumen biner melalui API MarkLogic REST? Lebih khusus lagi melalui titik akhir ekstensi sumber daya?

Saya melihat itu mungkin melalui fungsi xdmp:document-load tetapi tidak yakin bagaimana melakukannya menggunakan REST API.

xdmp:document-load("C:\my\path\test.txt",
    map:map() => map:with("uri", "/test/test.txt")
              => map:with("format", "binary")
)

Saya telah mencoba memuat dokumen yang sama melalui PUT /v1/documents API dan menyetel parameter format menjadi binary. Tapi itu masih dimuat sebagai file text.

Kasus penggunaannya adalah saya perlu mencerna banyak file lampiran yang terkadang menyertakan beberapa file teks. Saya tidak perlu MarkLogic untuk mengindeks konten mereka dan pada kenyataannya banyak dari file tersebut memiliki masalah penyandian atau format jika MarkLogic mencoba untuk melakukannya.

Terima kasih!

1
Fan Li 15 Maret 2020, 03:12

1 menjawab

Jawaban Terbaik

Dengan /v1/documents PUT, parameter format digunakan untuk menunjukkan format metadata, bukan dokumen.

Seperti yang dijelaskan dalam Mengontrol Jenis Konten Input dan Output

  • Utama: Pemetaan tipe MIME ekstensi URI, selama permintaan tidak menentukan fungsi transformasi.
  • Fallback: Pemetaan tipe MIME header tipe konten. Untuk input multi-bagian, header tipe-konten permintaan harus multi-bagian/campuran, sehingga header tipe-konten untuk setiap bagian menentukan tipe MIME konten untuk bagian itu.

Ekstensi file sumber daya dari URI dokumen digunakan untuk mencari Mimetype yang dikonfigurasi. Ini akan menggunakan format untuk Mimetype yang dikonfigurasi, jika ada entri yang cocok.

Sayangnya, header Content-type eksplisit tidak mengesampingkan penentuan format implisit. Jadi, jika Anda ingin memuat dokumen yang memiliki ekstensi file .txt sebagai dokumen binary() maka Anda perlu menerapkan beberapa solusi.

Untuk memuat dokumen teks sebagai binary() dengan /v1/documents PUT Anda dapat:

  • Gunakan ekstensi file yang berbeda. Tambahkan ".bin" ke akhir URI file teks yaitu /myTextFile.txt.bin. Itu mungkin tidak diinginkan, karena itu mengubah URI dokumen dari aslinya, tetapi menunjukkan bahwa dokumen teks disimpan sebagai dokumen biner.
  • Terapkan transformasi khusus saat memuat dokumen dan tentukan yang diinginkan Content-type

Contoh transformasi passthrough yang dapat diterapkan, sehingga deteksi format URL implisit tidak diterapkan, dan header Content-type eksplisit diterapkan:

function noop(context, params, content){
  return content;
} 
exports.transform=noop

Setelah menginstal transformasi kustom dengan nama noop: Di bawah ini adalah contoh perintah curl yang menginstal transformasi noop. Perbarui nama pengguna/kata sandi yang sesuai:

curl --anyauth --user myUsername:myPassword -X PUT -i -d "function noop(context, params, content){return content;} exports.transform=noop" -H "Content-type: application/vnd.marklogic-javascript" http://localhost:8000/LATEST/config/transforms/noop

Kemudian dimungkinkan untuk memanggil /v1/documents PUT dan menetapkan Content-type sebagai Mimetype biner (dalam contoh ini, sebagai application-octet-stream):

curl --anyauth --user myUsername:myPassword -T ./test.txt -i -H "Content-type: application/octet-stream" "http://localhost:8000/v1/documents?uri=/test.txt&transform=noop"

Dan itu akan dimuat sebagai binary() alih-alih text()

doc("/test.txt")/node()/xdmp:node-kind(.)

Hasil: binary

3
Mads Hansen 15 Maret 2020, 12:18