sql >> Databáze >  >> RDS >> Mysql

Jak přimějete, aby vaše fulltextové booleovské vyhledávání zachytilo výraz C++?

Budete muset změnit představu MySQL o tom, co slovo je.

Za prvé, výchozí minimální délka slova je 4. To znamená, že se nikdy nebude shodovat žádný hledaný výraz obsahující pouze slova o <4 písmenech, ať už jde o ‚C++‘ nebo ‚cpp‘. Můžete to nakonfigurovat pomocí ft_min_word_len možnost konfigurace, např. ve vašem my.cfg:

[mysqld]
ft_min_word_len=3

(Pak zastavte/spusťte MySQLd a znovu vytvořte fulltextové indexy.)

Za druhé, „+“ není v MySQL považováno za písmeno. Můžete z toho udělat písmeno, ale pak to znamená, že nebudete moci hledat slovo „ryba“ v řetězci „ryba+hranolky“, takže je zapotřebí určité opatrnosti. A není to triviální:vyžaduje to rekompilaci MySQL nebo hacknutí existující znakové sady. Viz část začínající „Pokud chcete změnit sadu znaků, které jsou považovány za slovní znaky...“ v část 11.8.6 doc.

Ano, něco takového je běžné řešení:svá ‚skutečná‘ data (bez escapování) můžete uchovávat v primární, definitivní tabulce — obvykle pomocí InnoDB pro dodržování ACID. Poté lze přidat pomocnou tabulku MyISAM, obsahující pouze pozměněná slova pro fulltextové vyhledávání návnady. Pomocí tohoto přístupu můžete také provést omezenou formu stemmingu.

Další možností je detekovat vyhledávání, která MySQL neumí, například vyhledávání s pouze krátkými slovy nebo neobvyklými znaky, a vrátit se k jednoduchému, ale pomalému vyhledávání LIKE nebo REGEXP pouze pro tato vyhledávání. V tomto případě budete pravděpodobně také chtít odstranit stoplist nastavením ft_stopword_file na prázdný řetězec, protože není praktické vyzvednout vše, co je v něm také speciální.



  1. Při pokusu o přidání více cizích klíčů se v SQL objeví chyba

  2. Jsou připravené příkazy ukládány do mezipaměti na straně serveru při vícenásobném načtení stránky pomocí PHP?

  3. Jak mohu zavolat uloženou proceduru SQL pomocí EntityFramework 7 a Asp.Net 5

  4. Je možné, aby poddotaz vrátil dvě hodnoty?