2012-02-03 18 views
1

データベースの実際の検索機能を初めて作成しています。検索アルゴリズムの実装方法

データベースは、ホテル名、ホテルの食料品、ホテルのロケーションで構成されています。

文字列の検索中に上記の3つが表示されます。

一般的な検索アルゴリズムはありますか?

予想される結果セット:

id |名前|説明|テーブル名|ランク

56 | KFC |フライドチキン|ホテル| 1

12 | [食品の名前] | | [食品の説明] | food_item | 2

19 | [ホテル名] | [ホテルの説明] |ホテル| 3

....

+1

は、あなたが取得したいどのように複雑な依存しており、どのようなデータベースあなたは使用しています。 – dqhendricks

+0

私はmysqlを使用しています –

答えて

1

は、Microsoft SQL Serverを使用している場合は、FreeTextのは非常にうまく機能:

http://msdn.microsoft.com/en-us/library/ms176078.aspx

+0

ありがとう、私はどのように私のmysqlデータベースの全文検索を有効にする方法を探しています。 –

+0

http://devzone.zend.com/26/using-mysql-full-text-searching/ –

+0

答えには「フリーテキスト」がありますが、これはMicrosoft SQL Serverにのみ存在します。上記のリンクを使ってMySQLの全文検索を試してください –

2

あなたは、リレーショナルデータベースを意味していますか? 「はい」の場合、「検索」アルゴリズムはWHERE句です。

コンテキスト検索を意味しますか? Luceneは、Javaで書かれた素晴らしい検索エンジンの実装です。これはLuceneのとそれを結婚役立つかもしれない:あなたには、いくつかの基準に基づいてウェブサイトをクロールを考えている場合

http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/

答えははるかに複雑です。どうか明らかにしてください。

+0

私は今日、より良い答えを見たことがありません。 +1 – Mob

+0

いいえ私は "where"句を意味するものではありません。私は、検索結果が検索文字列に応じてランク付けされるようにしたいと思います。単純なselect *から... –

+0

私は3つの異なるテーブルを検索する必要があり、3つの異なるクエリを書いてから検索をコンパイルしたくありません。 –

1

あなたがmysqlを使用しているとしましょう。

基本的に、ホテル名、食品、ホテルの場所を検索するクエリを作成する方法です。

私はこれらの3つの情報が3つの異なるテーブルに格納されていると思います。単に論文のようなクエリで3つのテーブル次々に照会することです最も簡単な方法:あなたの検索語がSQLインジェクション

  • あなたは(またはしない)から安全であることを確認してください

    SELECT * FROM hotel WHERE hotel_name LIKE "%foobar%"; 
    SELECT * FROM hotel_food_item WHERE item_name LIKE "%foobar%"; 
    SELECT * FROM hotel_location WHERE hotel_name LIKE "%foobar%" OR street_name LIKE "%foobar%" OR city LIKE "%foobar%"; 
    
    • したいですグループ1つの大きなクエリ

    へのクエリは、データベースには、(テーブルごとのような< 100 000行)大型化されている場合、またはあなたがロットまたは検索クエリを持っている場合、あなたは検索インデックスの作成に興味があるかもしれません、 専用データベースは、弾性検索などのテキスト検索を意図しています。

    編集: 関連性が問題である場合は、MATCH AGAINSTを使用します。

    あなたはMATCH AGAINSTを行う3つのサブクエリを作成する必要がありますし、それらを一緒にコンパイルします。 AGAINST("foobar") as rankを実行すると、必要なスコアが得られます。これは、のようになります

    :あなたはInnoDBのテーブルを使用していない、代わりにMyISAMテーブルを使用している場合

    SELECT * 
    FROM 
    (
    SELECT id, 'hotel' as table_name, MATCH (search_field1) AGAINST ("lorem") as rank FROM tableA 
    UNION 
    SELECT id, 'food' as table_name, MATCH (search_field2) AGAINST ("lorem") as rank FROM tableB 
    ) as res 
    
    ORDER BY res.rank DESC 
    
  • +0

    :)私はそれをすることができることを知っています。 しかし、私は検索キーに応じて結果をランク付けできるようにしたい。 –

    +1

    あなたは「関連性」を意味しますか? – FMaz008

    +0

    @Prakash Raman関連性の検索の詳細については、編集の回答。 – FMaz008

    1

    は、MySQLのフルテキスト検索で構築を使用することができます。

    これが最初の検索したい列にフルテキストインデックスを入れ、その後、おおよそ次のようになりますクエリを作成することで動作します。

    SELECT *, MATCH(column_to_search) AGAINST($search_string) AS relevance 
    FROM your_table 
    WHERE MATCH(keywords) AGAINST($search_string IN BOOLEAN MODE) 
    ORDER BY relevance 
    LIMIT 20 
    
    +0

    ルケンも提案されているように高度ではありませんが、実装が簡単で、私が経験したことから、かなりうまく動作します。 – dqhendricks

    関連する問題