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

एसक्यूएल में सबस्ट्रिंग खोज को लागू करने का सबसे अच्छा तरीका क्या है?

मेरी प्रस्तुति देखें MySQL में प्रैक्टिकल फुलटेक्स्ट सर्च ए> .

मैंने तुलना की:

आज मैं जो उपयोग करूंगा वह है अपाचे सोलर , जो ल्यूसीन को अतिरिक्त सुविधाओं और उपकरणों के समूह के साथ एक सेवा में डालता है।

अपनी टिप्पणी दें:आह, ठीक है, नहीं। मेरे द्वारा उल्लिखित पूर्ण पाठ खोज क्षमताओं में से कोई भी मदद करने वाला नहीं है, क्योंकि वे सभी किसी न किसी प्रकार की शब्द सीमाओं को मानते हैं

मनमाने ढंग से सबस्ट्रिंग को कुशलता से खोजने का दूसरा तरीका है N-gram दृष्टिकोण। मूल रूप से, एन अक्षरों के सभी संभावित अनुक्रमों का एक सूचकांक बनाएं और उन स्ट्रिंग्स को इंगित करें जहां प्रत्येक संबंधित अनुक्रम होता है। आमतौर पर यह N=3, या trigram के साथ किया जाता है , क्योंकि यह लंबी सबस्ट्रिंग के मिलान और इंडेक्स को एक प्रबंधनीय आकार में रखने के बीच समझौता करने का एक बिंदु है।

मैं किसी ऐसे SQL डेटाबेस के बारे में नहीं जानता जो पारदर्शी रूप से N-gram अनुक्रमण का समर्थन करता हो, लेकिन आप इसे उल्टे अनुक्रमणिका का उपयोग करके स्वयं सेट कर सकते हैं :

create table trigrams (
  trigram char(3) primary key
);

create table trigram_matches (
  trigram char(3),
  document_id int,
  primary key (trigram, document_id),
  foreign key (trigram) references trigrams(trigram),
  foreign key (document_id) references mytable(document_id)
);

अब इसे कठिन तरीके से भरें:

insert into trigram_matches
  select t.trigram, d.document_id
  from trigrams t join mytable d
    on d.textcolumn like concat('%', t.trigram, '%');

बेशक इसमें काफी समय लगेगा! लेकिन एक बार यह हो जाने के बाद, आप और अधिक तेज़ी से खोज सकते हैं:

select d.*
from mytable d join trigram_matches t
  on t.document_id = d.document_id
where t.trigram = 'abc'

बेशक आप तीन वर्णों से अधिक लंबे पैटर्न की खोज कर रहे होंगे, लेकिन उलटा सूचकांक अभी भी आपकी खोज को बहुत कम करने में मदद करता है:

select d.*
from mytable d join trigram_matches t
  on t.document_id = d.document_id
where t.trigram = 'abc'
  and d.textcolumn like '%abcdef%';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql का उपयोग करके वास्तविक समय में गतिशील डेटा को द्वि-दिशात्मक रूप से सिंक्रनाइज़ करने का सबसे अच्छा तरीका कौन सा है

  2. MySql बल्क लोड कमांड लाइन टूल

  3. MySQL GROUP BY दो कॉलम

  4. MySql में क्वेरी निष्पादित करते समय only_full_group_by से संबंधित त्रुटि

  5. PostgreSQL SELECT स्टेटमेंट में डुप्लिकेट पंक्तियों को हटा दें