データベースMySQLに同義語を保存および取得する最良の方法

StackOverflow https://stackoverflow.com/questions/3974671

  •  09-10-2019
  •  | 
  •  

質問

完全なテキスト検索を行う前に、データベースに保存して取得する同義語リストを作成しています。

ユーザーが次のように入力したとき:word1

同義語のテーブルでこの単語を検索する必要があります。したがって、単語が見つかった場合、この単語のすべての同義語を選択し、次のクエリのフルテキスト検索でそれを使用します。

ブールモードで(word1a word1b word1c)と一致する(列名)

それでは、同義語をテーブルに保存するにはどうすればよいですか? 2つの選択肢が見つかりました:

  1. のようなキーとワードの列を使用します

    val  keyword
    -------------
    1    word1a
    1    word1b
    1    word1c
    2    word2a
    2    word2b
    3    word3a
    etc.
    

そのため、入力された単語の正確な一致を1つのクエリで見つけて、IDであることがわかります。次の選択では、そのIDですべての単語を取得し、サーバーサイドランゲージのレコードセットループを使用して何らかの形でそれらをコンコンします。次に、単語を探す必要があるメインテーブルで実際の検索を構築できます。

  1. のような単語列のみを使用します

    word1a|word1b|word1c
    word2a|word2b|word2c
    word3a
    

今、私はそれがどんなレコードの中にある場合でも私の言葉を選択します。もしそうなら、すべてのレコードを抽出して爆発させます|そして、私は再び私が使うことができるという私の言葉を持っています。

この2番目のアプローチは、この同義語のデータベースを作成する人にとっては維持が容易に見えますが、2つの問題があります。

a)単語が文字列内にある場合、mysqlでどのように見つけることができますか?シノニムはストローベリーであり、ストロウベリーは鳥であり、単語2aがベリーになる可能性があるため、シノニムは非常に似ている可能性があるため、私はそれが好きではありません。明らかに私は正確な一致が必要なので、文字列内でのようなステートメントが正確に一致するのはどうしてですか?

b)速度の問題が見られます。「=」よりも多くのmysqlのテイクを使用して、単語を正確に一致させる最初のアプローチを使用していると思います。一方、最初のオプションでは、2つのステートメントが必要です。1つは単語のIDを取得し、2つ目はこのIDですべての単語を取得する必要があります。

この問題をどのように解決しますか?管理者が同義語を追加/編集するのが簡単で、同時に速くて最適な3番目の方法はありますか?わかりました、私は通常最良の方法がないことを知っています;-)

アップデート: :マスターワードに2つのテーブル1を使用する解決策、同義語には2番目は私の場合は機能しません。検索フィールドにユーザーが入力されるマスターワードがないからです。彼はフィールドのいずれかの同義語を入力できますので、私は1つのテーブルにIDがあり、2番目のテーブルにマスターのIDが付いたシノニムがあるというマスターワードがないので、このテーブルをどのように設定するかをまだ疑問に思っています。マスターワードはありません。

役に立ちましたか?

解決

(1つの)文字列を使用して異なるエントリを保存しないでください。

言い換えれば、単語テーブル(Word_id、word)と同義語テーブル(word_id、synonym_id)を作成し、単語テーブルに単語を追加し、同義語ごとに1つのエントリを同義語テーブルに追加します。

アップデート (3番目の同義語を追加)

単語テーブルにはすべての単語(すべて)が含まれている必要があります。同義語テーブルは、シノニムのポインターのみを保持します(単語ではありません!)。

3つの単語があれば、A、B、C、それが同義語です、あなたのDBは

WORD_TABLE            SYNONYM_TABLE
ID | WORD             W_ID | S_ID
---+-----             -----+-------
1  | A                  1  |  2
2  | B                  2  |  1
3  | C                  1  |  3
                        3  |  1
                        2  |  3
                        3  |  2  

Synonym_tableの多くのエントリを恐れないでください。それらはコンピューターによって管理され、単語間の既存の関係を反映するために必要です。



2番目のアプローチ

また、単語用の個別のフィールドと同義語(またはID)のリスト(Word_id、word、synonym_list)を備えた1つのテーブルを使用するために(私はそうすべきではないと思います!)。それはリレーショナルDBがどのように機能するかに反していることに注意してください(1つのフィールド、1つの事実)。

他のヒント

私は3列と1つのテーブルのみがword_tableの方が良いと思います

ID | WORD | GroupID
---+----------------
1  |  A   |   1
2  |  B   |   1
3  |  C   |   1

別のアプローチは意味を保存することです(これはマスターワードではなく、代わりにグループ化する意味の表を使用します)

単語を同義語なしで、そして次のようなテキストのみで単語を保存することです。

多くの言葉、一つの意味

meaning_table

meaning_id
---
1
2
3

たとえば、a、b、cがすべて1つの意味の同義語である場合、別のテーブルに単語を保存します。

word_table

word_id | meaning_id | word
--------+------------+------
1       |  1         |   A
2       |  1         |   B
3       |  1         |   C

それは何に似ているにもかかわらず ハサン・アミン・サランド 提案すると、Word_tableから選択していないが、その代わりにexange_tableから選択する重要な違いがあります。これははるかに優れており、難しい方法を学びました。

このようにして、意味をあるテーブルに保存し、他のテーブルで好きなようにその意味を意味します。

ただし、単語ごとに1つの意味があると想定しています。

多くの言葉、多くの意味

複数の意味のある単語を保存したい場合は、多くの人と多くの関係のために別のテーブルが必要であり、全体が次のようになります。

meaning_table
-------------
meaning_id
-------------
1
2
3

word_meaning_table
--------------------
word_id | meaning_id
--------+-----------
1       |  1         
2       |  1        
3       |  1         

word_table
--------------
word_id | word
--------+-----
1       |   A
2       |   B
3       |   C

これで、必要な数の意味を持つ多くの単語を手に入れることができます。ただし、どんな言葉でも、あなたが望むものを意味し、意味には多くの言葉があります。

単語を選択したいのなら、それが同義語である場合、あなたはします

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE meaning_id=1

その後、単語がまだない、またはその言葉がわからない意味を保存することもできます。

それが何に属しているのかわからない場合は、新しい単語ごとに新しい意味を挿入し、後でWord_tableで意味_IDを修正することができます。

その後、同じであるが意味のある単語を保存して選択することもできます

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE word_id=1
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top