MySQL全文検索の表意文字(アジア)文字
-
03-07-2019 - |
質問
ラテン文字で埋められたレコード(英語、フラン、#AIそれらを検索します。
MySQLのコメント:
中国語などの表意言語 日本人には言葉がない 区切り文字。したがって、FULLTEXT パーサーは単語を特定できません これらと他のようなもので始まり、終わります 言語。これの意味 問題のいくつかの回避策 セクション11.8で説明されています。 “全文検索関数”。
セクション11.8では実際に回避策は提供されておらず、問題に言及することすらありません。
では、混合文字データベースで単一の漢字の検索をどのようにソートしますか。 %LIKE%
は機能しますが、気の利いた関連性の評価はありません。キャラクターがレコードに登場する回数を数え、それによってランク付けするだけですか?アドバイスをお願いします。ありがとう!
解決
データセットのサイズに依存します。私たちが何十万行も話をしているのなら、おそらく、利用可能な優れた独立した全文検索ソリューションの1つを見てみるでしょう。私は実際にこの問題mysqlfに対処する必要がなかったので、アジア言語のサポートを含むソリューションがわからない。
ただし、 lucene は中国語、日本語、韓国語のアナライザーを備えていることを知っているので、あなたがしていることに対する何らかのサポートがあること。 luceneをphpに統合する必要があるときに通常行うことは、luceneをソケットサーバーとして実装し、phpから接続することです。
データセットが十分に小さい場合、独自のアドホックアプローチを展開するオプションになる可能性があります。この問題には2つの部分があります。ランク付けするドキュメントの取得と実際のランク付けです。検索を行う方法はいくつかあります。データセットが十分に小さい場合は、LIKEを使用することもできます。別の方法として、独自のディスクベースのインデックススキームをロールすることもできますが、これはかなり複雑で時間がかかります。以下で説明するように、MySQLを中間パスとして使用することもできます。
MySQLを使用してインデックススキームを実装するには、次の構造を持ついくつかのテーブルを作成する必要があります。
document
document_id
document_text
document_tokencount
document_token
document_id
token_id
token_docfrequency
index (token_id, document_id)
token
token_id
token_unicode
token_globalfrequency
index (token_unicode)
次に、各ドキュメントを処理し、ドキュメント内の各文字(トークン)のdocument_tokenテーブルに行を挿入します。 token_unicodeフィールドには、この文字を参照するために使用される整数のユニコードシーケンスが含まれます。 token_docfrequencyフィールドには、ドキュメントにトークンが含まれる回数に対応する整数が含まれ、token_globalfrequencyフィールドには、すべてのドキュメントで用語が使用される合計回数が含まれます。
これにより、トークンのクイック検索が可能になります:
SELECT * FROM document_token WHERE token_id = 1
UNION
SELECT * FROM document_token WHERE token_id = 2
UNION
SELECT * FROM document_token WHERE token_id = 3
(ユニオンアプローチは、mysqlがすべての選択に対してインデックスを利用できるようにするハックであり、単一のselectと複数のorステートメントを使用した対応するクエリよりも高速である可能性が高い)
これにより、関連するランキングが残りの問題として残ります。これは、あなたが本当に求めたものです。 :) ベクトル空間モデル(VSM)。
検索を実行した後、最初に行う必要があるのは、 tf-idfを計算することですこのトークンのスコア。これは、式を使用して行われます。
tf-idf = tf(t,d) / tf(d) * log(D / d(t))
where:
tf(t,d) = token frequency in current document
tf(d) = total number of tokens in current document
D = total number of documents
d(t) = number of document that contains the token
最初に検索クエリの各用語に対してこのスコアを計算し、結果をハッシュマップまたは類似の形式で保存します。これは、v_1と呼ばれる最初のベクトルです。次に、最初のドキュメントに進みます。ドキュメント内の各用語のtf-idfスコアも計算し、v_2として保存します。 コサインの類似性:
を使用して、このドキュメントのスコアを計算できるようになりました。score = arccos(v_1 * v_2 / (|v_1| * |v_2|))
結果は、ドキュメントのランク付けに使用できる値です。続行し、すべてのドキュメントに対してこれを実行します。降順に並べ替えます。リストの最初のドキュメントが最も関連性の高いドキュメントになります。
これは少し複雑に聞こえるかもしれませんが、線形代数の基本的な理解があれば、おそらく数時間で実用的なソリューションを生み出すことができます。それでも、可能であれば、luceneなどの既存のソリューションを使用してください。