Mysql
 sql >> база данни >  >> RDS >> Mysql

Пълнотекстови търсения в MySQL:доброто, лошото и грозното

Понякога, когато търсите в MySQL база данни, може да искате да стартирате заявки за пълнотекстово търсене срещу базирани на знаци данни. Днес обсъждаме предимствата и недостатъците на подобни методи за търсене.

Какво представляват пълнотекстови търсения в MySQL?

Търсенето в пълен текст е техника, която ви позволява да търсите записи, които може да не отговарят напълно на критериите за търсене. Пълнотекстови търсения в MySQL се извършват, когато се използват определени индекси и тези индекси имат много уникални нюанси, включително следното:

  • За да може индексът да се счита за индекс с пълен текст, индексът трябва да е от типа FULLTEXT.
  • Пълен текст индексите могат да се използват само в таблици, работещи с InnoDB или MyISAM механизми за съхранение.
  • FULLTEXT индексите могат да се създават само за колони CHAR, VARCHAR или TEXT.
  • Индексите на FULLTEXT се използват само когато се използва клаузата MATCH() AGAINST().
  • Пълнотекстови търсения имат три режима:режим на естествен език, булев режим и режим на разширяване на заявката.

Индексът FULLTEXT е специален тип индекс, който намира ключови думи в текста, вместо да сравнява стойностите със стойностите в индекса. Въпреки че търсенето на FULLTEXT е различно от другите типове съвпадения, имайте предвид, че можете да имате BTREE индекс и FULLTEXT индекс в една и съща колона едновременно - те няма да се противопоставят, защото са подходящи за различни цели.

Типове пълнотекстово търсене

Когато изпълнявате пълнотекстови търсения в MySQL, имайте предвид, че има три типа търсене, от които да избирате:

  1. Тип търсене на естествен език – такъв режим на търсене интерпретира низа за търсене като буквална фраза. Активирано по подразбиране, ако не е посочен модификатор или когато е посочен модификаторът IN NATURAL LANGUAGE MODE;
  2. Тип на търсене с разширение на заявката – такъв режим на търсене извършва търсенето два пъти. При второ търсене наборът от резултати включва няколко най-подходящи документа от първото търсене. Активирано с помощта на модификатора WITH QUERY EXPANSION;
  3. Булев тип търсене – такъв режим на търсене позволява търсене на сложни заявки, които могат да включват булеви оператори като по-малко от („<“) и повече от (“>“) оператори, подизрази (“( ” и “)”), знакът плюс (+), знакът минус (-), двойните кавички (“”), оператор, който намалява приноса на стойността към резултатите (~) и заместващият знак (*) - Операторът за заместващ знак позволява търсене с размито съвпадение (например „demo*“ също би съвпадало с „демонстрация“). Активирано с помощта на модификатора IN BOOLEAN MODE.

Търсене в пълен текст с режима за търсене на естествен език

Режимът за търсене на естествен език, както е отбелязано по-горе, е активиран по подразбиране или когато е посочен модификаторът IN NATURAL LANGUAGE MODE. Този режим извършва търсене на естествен език спрямо дадена текстова колекция (една или повече колони). Основният формат на заявката за пълнотекстови търсения в MySQL трябва да бъде подобен на следния:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Когато MATCH() се използва заедно с клауза WHERE, редовете автоматично се сортират първо по най-високата релевантност. За да търсите точен низ, оградете го с двойни кавички.

Пълнотекстови търсения с режима на разширяване на заявката

Търсенията в пълен текст също поддържат режима на разширяване на заявката. Такъв режим на търсене често се използва, когато потребителят разчита на подразбиращи се знания - например, потребителят може да търси "DBMS", надявайки се да види както "MongoDB", така и "MySQL" в резултатите от търсенето. Причината, поради която потребителят може да разчита на някои подразбиращи се познания, когато използва такъв режим на търсене, е доста проста - пълнотекстово търсене с режим на разширяване на заявката работи, като извършва търсенето два пъти:втората фраза за търсене е първата фраза за търсене съчетано с няколко най-подходящи записа от първото търсене. Това означава, че например, ако при първото търсене един от редовете съдържа думата „DBMS“ и думата „MySQL“, второто търсене ще намери записите, които ще включват думата „MySQL“, дори ако те не съдържат съдържат „DBMS“. Форматът на заявката, който ще използва режима на разширяване на заявката, ще изглежда така:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Търсене в пълен текст с помощта на булевия режим

Булевият режим е може би едно от най-интересните неща, които MySQL пълнотекстово търсене може да предложи. Този режим има много уникални предупреждения, защото ви позволява да разширите възможностите за търсене с помощта на булеви оператори. Когато се използва булевият режим, определени знаци могат да имат специално значение в началото или в края на думите. Например:

  • „+“ означава И;
  • „-“ означава НЕ;
  • Операторите “(“ и “)” позволяват да се създават подизрази;
  • „<” и „>” операторите променят ранга на стойността за търсене по-нисък или по-висок;
  • „~” намалява приноса на стойността към резултатите от търсенето;
  • Двойните кавички (“”) съответстват само на буквални стойности;
  • “*” е оператор с заместващ знак (вижте обяснението по-горе).

Тези оператори ви позволяват да разширите функционалността на търсенето:например, ако искате да извлечете всички редове, които съдържат думата „Demo“, но не и „Demo2“, можете да използвате заявка така:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

Можете също да използвате двойни кавички заедно с единични кавички, както следва:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Търсене в пълен текст

Преди да използвате пълнотекстово търсене в MySQL, имайте предвид, че търсенето има няколко „проблема“:

  • И двете машини за съхранение на InnoDB и MyISAM имат свои собствени списъци със спиращи думи. Списъкът със спиращи думи на InnoDB може да бъде намерен тук, списъкът със стоп думи на MyISAM може да бъде намерен тук.
    • За да дефинирате свой собствен списък със спирателни думи за InnoDB, дефинирайте таблица със същата структура като таблицата INNODB_FT_DEFAULT_STOPWORD, вмъкнете спирателни думи там, след което задайте стойността на опцията innodb_ft_server_stopword_table под формата на db_name/table_name.
    • За да дефинирате свой собствен списък със спирателни думи за MyISAM, задайте променливата ft_stopword_file на името на пътя на файла, съдържащ списъка със стоп думи. Във файла спиращите думи могат да бъдат разделени с произволен небуквенно-цифрен знак с изключение на „_“ и „‘“. Файлът за спираща дума по подразбиране се намира в storage/myisam/ft_static.c. Стоп думите могат да бъдат деактивирани, като зададете променливата на празен низ.
  • Пълнотекстови търсения не се поддържат в разделени таблици.
  • Всички колони в индекс FULLTEXT трябва да използват един и същ набор от знаци и съпоставяне.
  • Операциите за търсене в пълен текст не третират низа % като заместващ знак.

Ето още една уловка:може също да имате предвид, че вграденият анализатор на FULLTEXT определя къде започват и завършват думите, като разглежда определени знаци, включително интервал (“ “), запетая (“, ”) и точка (“.”), което означава, че ако вашият низ за търсене съдържа един или повече от тези знаци, резултатите от търсенето може да не са точни. Например, ако вашата база данни съдържа 5 реда с низа „test.demo“, заявката за търсене „test.demo“ може да върне повече (10, 15 и т.н.) резултати, включително „demo“, „string.demo_example“ и т.н., защото ще търси "demo" вместо "test.demo", така че може да сте заседнали с много неподходящи съвпадения. MySQL предлага решение за този проблем, ако желаете да напишете свой собствен плъгин на C или C++ (вижте документацията на MySQL), но дотогава не можете да направите много.

Пълният списък с ограниченията за пълен текст на MySQL може да се види на страницата с документация на MySQL.

Резюме

Възможността за пълнотекстово търсене на MySQL предоставя лесен начин за внедряване на различни техники за търсене (търсене на естествен език, търсене с разширение на заявка и булево търсене) във вашето приложение, работещо с MySQL. Всяка от тези техники за търсене има свои собствени предупреждения и всяка от тях може да е подходяща за различни цели - когато решавате дали да използвате пълнотекстово търсене, имайте предвид, че този тип търсене има много тънкости, уникални за себе си, знае както предимствата, така и недостатъците на използването на пълнотекстово търсене в MySQL и избирайте разумно.


  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. Какви са разликите между INSERT и UPDATE в MySQL?

  3. Как да използвате GROUP_CONCAT в CONCAT в MySQL

  4. как да изчислим сходството между два низа в MYSQL

  5. Разрешено ли е да използвате числа като имена на таблици в MySQL?