मेरी प्रस्तुति देखें MySQL में प्रैक्टिकल फुलटेक्स्ट सर्च ए> .
मैंने तुलना की:
LIKE
भविष्यवाणी करता है- रेगुलर एक्सप्रेशन
विधेय (
LIKE
. से बेहतर नहीं ) - MyISAM FULLTEXT अनुक्रमण
- Sphinx Search
- अपाचे ल्यूसीन
- उल्टा अनुक्रमण
- Google कस्टम खोज इंजन
आज मैं जो उपयोग करूंगा वह है अपाचे सोलर , जो ल्यूसीन को अतिरिक्त सुविधाओं और उपकरणों के समूह के साथ एक सेवा में डालता है।
अपनी टिप्पणी दें:आह, ठीक है, नहीं। मेरे द्वारा उल्लिखित पूर्ण पाठ खोज क्षमताओं में से कोई भी मदद करने वाला नहीं है, क्योंकि वे सभी किसी न किसी प्रकार की शब्द सीमाओं को मानते हैं
मनमाने ढंग से सबस्ट्रिंग को कुशलता से खोजने का दूसरा तरीका है 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%';