sql >> データベース >  >> RDS >> MariaDB

MATCHAGAINSTがMariaDBでどのように機能するか

    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.      |
    +----+---------------------------------+---------------------------------------+


    1. 前月または前年度の欠落データを累積的に追加する

    2. すべてのテーブル名を一覧表示するPostgreSQLクエリ?

    3. SQL Serverデータベースの回復保留状態を修正するにはどうすればよいですか?

    4. biginteger配列関数