Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Libpuzzle Lập chỉ mục hàng triệu bức ảnh?

Vì vậy, hãy xem ví dụ mà họ đưa ra và cố gắng mở rộng.

Giả sử bạn có một bảng lưu trữ thông tin liên quan đến từng hình ảnh (đường dẫn, tên, mô tả, v.v.). Trong bảng đó, bạn sẽ bao gồm một trường cho chữ ký nén, được tính toán và lưu trữ khi bạn điền cơ sở dữ liệu ban đầu. Do đó, hãy xác định bảng đó:

CREATE TABLE images (
    image_id INTEGER NOT NULL PRIMARY KEY,
    name TEXT,
    description TEXT,
    file_path TEXT NOT NULL,
    url_path TEXT NOT NULL,
    signature TEXT NOT NULL
);

Khi bạn tính toán chữ ký ban đầu, bạn cũng sẽ tính toán một số từ từ chữ ký:

// this will be run once for each image:
$cvec = puzzle_fill_cvec_from_file('img1.jpg');
$words = array();
$wordlen = 10; // this is $k from the example
$wordcnt = 100; // this is $n from the example
for ($i=0; $i<min($wordcnt, strlen($cvec)-$wordlen+1); $i++) {
    $words[] = substr($cvec, $i, $wordlen);
}

Bây giờ bạn có thể đặt những từ đó vào một bảng, được định nghĩa như vậy:

CREATE TABLE img_sig_words (
    image_id INTEGER NOT NULL,
    sig_word TEXT NOT NULL,
    FOREIGN KEY (image_id) REFERENCES images (image_id),
    INDEX (image_id, sig_word)
);

Bây giờ, bạn chèn vào bảng đó, viết trước chỉ mục vị trí của từ được tìm thấy, để bạn biết khi nào một từ khớp với từ đó khớp ở cùng một vị trí trong chữ ký:

// the signature, along with all other data, has already been inserted into the images
// table, and $image_id has been populated with the resulting primary key
foreach ($words as $index => $word) {
    $sig_word = $index.'__'.$word;
    $dbobj->query("INSERT INTO img_sig_words (image_id, sig_word) VALUES ($image_id,
        '$sig_word')"); // figure a suitably defined db abstraction layer...
}

Do đó, dữ liệu của bạn được khởi tạo, bạn có thể lấy hình ảnh với các từ phù hợp một cách tương đối dễ dàng:

// $image_id is set to the base image that you are trying to find matches to
$dbobj->query("SELECT i.*, COUNT(isw.sig_word) as strength FROM images i JOIN img_sig_words
    isw ON i.image_id = isw.image_id JOIN img_sig_words isw_search ON isw.sig_word =
    isw_search.sig_word AND isw.image_id != isw_search.image_id WHERE
    isw_search.image_id = $image_id GROUP BY i.image_id, i.name, i.description,
    i.file_path, i.url_path, i.signature ORDER BY strength DESC");

Bạn có thể cải thiện truy vấn bằng cách thêm HAVING mệnh đề yêu cầu strength tối thiểu , do đó làm giảm thêm tập hợp đối sánh của bạn.

Tôi không đảm bảo rằng đây là thiết lập hiệu quả nhất, nhưng nó gần như phải hoạt động tốt để hoàn thành những gì bạn đang tìm kiếm.

Về cơ bản, việc chia nhỏ và lưu trữ các từ theo cách này cho phép bạn kiểm tra khoảng cách sơ bộ mà không cần phải chạy một chức năng chuyên biệt trên các chữ ký.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để sửa lỗi giá trị chuỗi không chính xác?

  2. Chèn một văn bản tiếng Ba Tư trong bảng mysql

  3. Truy vấn MySQL chậm hơn sau khi tạo chỉ mục

  4. SUM (DISTINCT) Dựa trên các cột khác

  5. Cách kết nối với MySQL bằng Python