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

複数のテーブルにわたるMysql全文検索の関連性

    はい、ApacheLuceneやSolrなどの検索エンジンを使用してそれらを非常にうまく統合できます。

    http://lucene.apache.org/solr/

    MySQLでのみ実行する必要がある場合は、UNIONを使用して実行できます。おそらく、関連性のない結果を抑制したいと思うでしょう。

    どのテーブルが一致するかに応じて、関連性にどのように影響を与えるかを決定する必要があります。

    たとえば、記事の重要度を最も高くし、イベントの重要度を中程度にし、ページの重要度を最も低くしたいとします。次のような乗数を使用できます:

    set @articles_multiplier=3;
    set @events_multiplier=2;
    set @pages_multiplier=1;
    

    これらのテクニックのいくつかを示す、実際に試すことができる例を次に示します。

    サンプルデータを作成する:

    create database d;
    use d;
    
    create table articles (id int primary key, content text) ENGINE = MYISAM;
    create table events (id int primary key, content text) ENGINE = MYISAM;
    create table pages (id int primary key, content text) ENGINE = MYISAM;
    
    insert into articles values 
    (1, "Lorem ipsum dolor sit amet"),
    (2, "consectetur adipisicing elit"),
    (3, "sed do eiusmod tempor incididunt");
    
    insert into events values 
    (1, "Ut enim ad minim veniam"),
    (2, "quis nostrud exercitation ullamco"),
    (3, "laboris nisi ut aliquip");
    
    insert into pages values 
    (1, "Duis aute irure dolor in reprehenderit"),
    (2, "in voluptate velit esse cillum"),
    (3, "dolore eu fugiat nulla pariatur.");
    

    検索可能にする:

    ALTER TABLE articles ADD FULLTEXT(content);
    ALTER TABLE events ADD FULLTEXT(content);
    ALTER TABLE pages ADD FULLTEXT(content);
    

    UNIONを使用して、これらすべてのテーブルを検索します。

    set @target='dolor';
    
    SELECT * from (
      SELECT 
        'articles' as 'table_name', id, 
        @articles_multiplier * (MATCH(content) AGAINST (@target)) as relevance
        from articles
      UNION
      SELECT 
        'events' as 'table_name', 
        id,
        @events_multiplier * (MATCH(content) AGAINST (@target)) as relevance
        from events
      UNION
      SELECT 
        'pages' as 'table_name', 
        id, 
        @pages_multiplier * (MATCH(content) AGAINST (@target)) as relevance
        from pages
    )
    as sitewide WHERE relevance > 0;
    

    結果:

    +------------+----+------------------+
    | table_name | id | relevance        |
    +------------+----+------------------+
    | articles   |  1 | 1.98799377679825 |
    | pages      |  3 | 0.65545331108093 |
    +------------+----+------------------+
    


    1. oracletmstmpフィールドからミリ秒を削除する

    2. このテーブルで重複する連続した値を見つけるにはどうすればよいですか?

    3. MySqlデータベースからčćđšžのような記号を読む

    4. 複数のホスト上のPHPサイトのセッションを処理するための最良の方法は何ですか?