Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Libpuzzle लाखों चित्रों को अनुक्रमित कर रहा है?

तो, आइए उनके द्वारा दिए गए उदाहरण पर एक नज़र डालें और विस्तार करने का प्रयास करें।

आइए मान लें कि आपके पास एक टेबल है जो प्रत्येक छवि (पथ, नाम, विवरण, आदि) से संबंधित जानकारी संग्रहीत करती है। उस तालिका में, आप संपीड़ित हस्ताक्षर के लिए एक फ़ील्ड शामिल करेंगे, जब आप प्रारंभ में डेटाबेस को पॉप्युलेट करते हैं तो गणना और संग्रहीत किया जाता है। आइए उस तालिका को इस प्रकार परिभाषित करें:

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
);

जब आप शुरू में हस्ताक्षर की गणना करते हैं, तो आप हस्ताक्षर से कई शब्दों की गणना भी करने जा रहे हैं:

// 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);
}

अब आप उन शब्दों को एक तालिका में रख सकते हैं, जिसे इस प्रकार परिभाषित किया गया है:

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)
);

अब आप उस तालिका में सम्मिलित करें, जहां शब्द पाया गया था, उसकी स्थिति अनुक्रमणिका तैयार करना, ताकि आप जान सकें कि जब कोई शब्द मेल खाता है तो वह हस्ताक्षर में उसी स्थान पर मेल खाता है:

// 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...
}

आपका डेटा इस प्रकार आरंभिक हो गया है, आप अपेक्षाकृत आसानी से मेल खाने वाले शब्दों के साथ चित्र ले सकते हैं:

// $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");

आप HAVING . जोड़कर क्वेरी को बेहतर बना सकते हैं खंड जिसके लिए न्यूनतम strength की आवश्यकता होती है , इस प्रकार आपके मिलान सेट को और कम कर देता है।

मैं इस बात की कोई गारंटी नहीं देता कि यह सबसे कुशल सेटअप है, लेकिन आप जो खोज रहे हैं उसे पूरा करने के लिए यह मोटे तौर पर कार्यात्मक होना चाहिए।

मूल रूप से, शब्दों को इस तरह से विभाजित करना और संग्रहीत करना आपको हस्ताक्षरों पर एक विशेष कार्य चलाने के बिना किसी न किसी दूरी की जांच करने की अनुमति देता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqlimport:त्रुटि:1045, प्रवेश निषेध

  2. InnoDB कैसे हल करें:./ibdata1 mysql त्रुटि को लॉक करने में असमर्थ?

  3. वेबसाइट बनाते समय /var/www/html के अंदर अनुमति अस्वीकार कर दी गई है और यह apache2 सर्वर के साथ फाइल है

  4. गूगल मैप्स एपीआई का उपयोग करके mySQL डेटाबेस में वर्तमान जीपीएस निर्देशांक भेजें

  5. सिम्फनी 2 में सिद्धांत 2:मैं कैसे देख सकता हूं कि कौन सी ऑब्जेक्ट-कॉल एक क्वेरी में ले जाती है?