MariaDBでは、MATCH AGAINST フルテキストインデックスでフルテキスト検索を実行するために使用される特別な構造です。
構文
構文は次のようになります:
MATCH (col1,col2,...) AGAINST (expr [search_modifier]) 例
Productsというテーブルがあるとします。 これには次のデータが含まれます:
+----+---------------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 5 | Sledge Hammer | Wooden handle. Free wine glasses. | | 6 | Chainsaw | Orange. Includes spare fingers. | | 7 | Straw Dog Box | Tied with vines. Very chewable. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+-----------------------------------------+
このテーブルのProductDescriptionにはフルテキストインデックスがあります 桁。つまり、MATCH AGAINSTを使用できます その列に対して全文検索を実行します。
例:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC; 結果:
+----+--------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+--------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 6 | Chainsaw | Orange. Includes spare fingers. | +----+--------------------------+-----------------------------------------+
スコアを取得
MATCH AGAINSTを含めることができます SELECTで 検索された列内のキーワードの関連性スコアを返すためのリスト:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC; 結果:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
この場合、ORDER BYも使用しました スコアを降順で並べ替える句(つまり、最も関連性の高いものから順に)
フルテキストインデックスのない列
前の例が機能した理由は、以前にProductDescriptionにフルテキストインデックスを作成したためです。 桁。これを行わなかった場合、エラーが発生していました。
MATCH AGAINSTを使おうとすると次のようになります フルテキストインデックスがない列に対して:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC; 結果:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
ProductNameにフルテキストインデックスを追加しましょう 列:
ALTER TABLE Products
ADD FULLTEXT(ProductName); 次に、クエリを再度実行します:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC; 結果:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
今回はうまくいきました。
複数列のフルテキストインデックス
複数の列にフルテキストインデックスを追加できます。
例:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
これで、MATCH AGAINSTを実行できます そのフルテキストインデックスに対して。
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC; 結果:
+----+---------------------------------+---------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+---------------------------------------+ | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+---------------------------------------+