Go 言語を使用して MySQL データの高性能全文検索を作成する方法

WBOY
リリース: 2023-06-17 11:28:07
オリジナル
1203 人が閲覧しました

インターネットの急速な発展に伴い、データ量は増加しており、高速なデータクエリの必要性がますます高まっています。現在、全文検索エンジンは比較的一般的なデータクエリ方法であり、電子商取引 Web サイト、ニュース Web サイト、ブログなどのさまざまな分野に適用できます。この記事では、Go 言語を使用して高性能な MySQL データ全文検索を作成する方法を紹介します。

1. 全文検索とは

全文検索 (Full-Text Search) とは、テキストの中から特定のキーワードに一致するすべてのテキスト レコードを検索する検索技術を指します。従来のあいまい検索や文字列一致とは異なり、全文検索エンジンは語彙、文法、セマンティクスなどの複数の要素を分析するクエリ方法であり、データ クエリの効率と精度を大幅に向上させることができます。

2. Go 言語と MySQL

Go 言語は、Google によって開発され、2009 年に正式にリリースされたオープンソース プログラミング言語です。シンプルさ、効率性、同時実行性という特徴があり、ネットワークプログラミング、クラウドコンピューティング、マイクロサービスなどの分野で広く使用されています。 MySQL は、高いパフォーマンス、スケーラビリティ、データ セキュリティなどの利点を備えたオープン ソースのリレーショナル データベースであり、Web アプリケーション開発において最も一般的なデータベース管理システムの 1 つです。 Go 言語と MySQL の緊密な統合により、強力なデータ クエリと処理機能が提供されます。

3. MySQL フルテキスト インデックスを作成する

MySQL をフルテキスト検索に使用する前に、まず検索対象のテーブルにフルテキスト インデックスを作成する必要があります。データ テーブルの名前が "article" であるとします。このテーブルには、"title" と "content" という 2 つのフィールドが含まれています。そのテーブルの全文インデックスを作成する必要があります。具体的な手順は次のとおりです:

  1. データベース接続の作成
db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/database")
if err != nil {
    log.Fatal(err)
}
defer db.Close()
ログイン後にコピー
  1. フルテキスト インデックス作成ステートメントを実行します
_, err := db.Exec("ALTER TABLE article ADD FULLTEXT(title, content)")
if err != nil {
    log.Fatal(err)
}
ログイン後にコピー

実行後、フルテキスト インデックスを作成できます。 「タイトル」と「コンテンツ」の 2 つのフィールドを使用して、効率的なテキスト検索を実行します。

4. MySQL 全文検索を実装する Go 言語

フルテキスト インデックスを作成した後、Go 言語を使用して MySQL 全文検索を実装できます。具体的な実装コードは以下の通りです。

  1. クエリ結果構造の定義
type Result struct {
    ID      int64  `json:"id"`
    Title   string `json:"title"`
    Content string `json:"content"`
}
ログイン後にコピー

記事 ID、タイトル、コンテンツをそれぞれ表す 3 つの属性を定義しました。

  1. 全文検索機能の実装
func Search(keyword string) ([]Result, error) {
    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/database")
    if err != nil {
        return nil, err
    }
    defer db.Close()

    rows, err := db.Query("SELECT id, title, content, MATCH(title, content) AGAINST(?) AS score FROM article WHERE MATCH(title, content) AGAINST(?)", keyword, keyword)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var results []Result
    for rows.Next() {
        var id int64
        var title string
        var content string
        var score float64
        if err := rows.Scan(&id, &title, &content, &score); err != nil {
            return nil, err
        }
        results = append(results, Result{ID: id, Title: title, Content: content})
    }
    if err := rows.Err(); err != nil {
        return nil, err
    }

    return results, nil
}
ログイン後にコピー

この関数はキーワードをパラメータとして受け取り、「記事」の「タイトル」フィールドと「内容」フィールドをクエリします。テーブルを作成し、MATCH AGAINST ステートメントを使用してスコアを計算し、最後にクエリ結果を定義された Result 構造に解析します。

5. クエリ パフォーマンスの最適化

実際のアプリケーションでは、全文検索のクエリ特性は複雑なクエリ ステートメントと大量のデータの検索であるため、最適化する必要があります。

  1. 接続プールを使用する

複数回クエリを実行すると、データベース接続の作成と破棄により追加のオーバーヘッドが発生します。接続プールを使用すると、このオーバーヘッドが削減され、クエリの効率が向上します。接続プールのサイズは、「database/sql」パッケージの DB.SetMaxIdleConns および DB.SetMaxOpenConns を使用して設定できます。

  1. ビルド キャッシュ

全文検索クエリには高いパフォーマンス要件があり、キャッシュを使用してクエリ速度を最適化できます。クエリを実行する場合、最初にキャッシュから結果を取得できます。キャッシュが存在しない場合は、データベース クエリを実行してクエリ結果をキャッシュします。後続のクエリでは、キャッシュに結果がある場合、クエリの繰り返しを避けるために結果が直接返されます。

  1. ページング クエリを使用する

大量のデータを処理する場合、ページング クエリを使用すると、クエリに必要なリソースが削減され、クエリの効率が向上します。 「LIMIT」および「OFFSET」キーワードを使用してクエリ結果をページ分割し、各ページに表示される項目の数と現在のページ番号を設定できます。

6. 概要

全文検索は、必要なデータを迅速に検索して取得するのに役立つ効率的なデータ クエリ方法です。 Go言語とMySQLを組み合わせることで、高性能な全文検索機能を実現します。実際のアプリケーションでは、接続プーリング、キャッシュ、ページング クエリ、その他のテクノロジを組み合わせて最適化し、クエリの効率とパフォーマンスをさらに向上させることもできます。

以上がGo 言語を使用して MySQL データの高性能全文検索を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート