7

最近SqLiteを使い始めたので、比較的初心者です。全文検索機能を使用して、チャット ロボットの大まかな一致を見つけようとしています。基本的には、できるだけ多くのキーワードに一致させたいと考えていますが、必ずしもすべてのキーワードに一致させる必要はありません。結果は、フレーズで見つかったキーワードの数と、それらがクエリにどれだけ近い順序であるかに基づいて並べ替える必要があります。つまり、順序は正確である必要はありませんが、順序が近いほど、結果のランクが高くなります。同様に、フレーズ内の単語が 1 つまたは 2 つしか見つからない場合でも一致するはずですが、存在する単語が多いほどランクが高くなります。リファレンスを読み、NEAR ステートメントと matchinfo 関数、およびその使用方法の例を確認しましたが、この知識を特定の問題に適用する方法がわかりません。誰か提案はありますか?

よろしくお願いします。

4

3 に答える 3

1

最近、これは SqLite メーリング リストでは不可能だと言われました。私が解決策に最も近かったのは、検索エンジンのようにストップ ワードを取り除くことと、ポーター ステマー アルゴリズムを使用してクエリをさらに一般化することでした。最初にキーワードの完全なセットを検索し (もちろん句読点などは除きます)、次にステミングを適用して同じキーワード セットを検索し、次に同じセットでストップ ワードを削除して検索し、最後にステミングを使用してこの同じ削除されたサブセットを検索します。適用すると、最良から最悪までの合理的な概算が得られるようです。もちろん、いくつかの一致が見つかるとすぐに、上記のチェーンに続くより一般的なクエリは実行されません。

于 2012-06-16T13:59:23.393 に答える
1

この情報はoffsets補助機能を介して取得できるようです。より完全なドキュメントへのリンクは次のとおりです。

4.1. オフセット機能

基本的に、関数をクエリに追加すると、ドキュメント内のオフセットが返されます。

SELECT offsets(data) FROM data ...

各結果は、スペースで区切られた 4 つの整数のリストです。3 番目の列は、列内の一致する用語のバイト オフセットです。その情報を使用してソリューションを作成できるはずです。

これは、いくつかの探索的クエリのトランスクリプトです。

sqlite> create virtual table data using fts4(body);

sqlite> insert into data(body) 
  values('the quick brown fox jumps over the lazy dog');

sqlite> insert into data(body) 
  values('the lazy brown fox quickly jumps over the lazy dog');

sqlite> select * from data where body match 'lazy';
the quick brown fox jumps over the lazy dog
the lazy brown fox quickly jumps over the lazy dog

sqlite> select rowid,offsets(data) from data where body match 'brown';
1|0 0 10 5
2|0 0 9 5

sqlite> select rowid,offsets(data) from data where body match 'lazy';
1|0 0 35 4
2|0 0 4 4 0 0 42 4

したがって、brown vs lazy を検索する場合、これらのドキュメントは両方とも一致します。

最初のドキュメントでは、茶色は 10 で、レイジーは 35 です。それらは 25 離れています。

2 番目の文書では、茶色は 9 で、レイジーは 4 と 42 です。これらは 5 と 33 離れています。

また、述語の用語の順序も参照しますが、同じクエリで 2 つの用語を照合しようとすると機能しません。誤解しているのか、それとも正しいセマンティクスを知らないだけなのかはわかりません。

sqlite 内ですべてのランキング計算を行うために使用できる SQL ピボットの悪ふざけがいくつかあると思います。sqlite から結果を取得し、自分でランキング計算を行う方が、おそらくより保守しやすいでしょう。

于 2012-06-17T18:38:09.297 に答える
-1

これは、使用できるSQLクエリです....

Select * 
From Tablename 
Where Yourfield = '"+textbox.text(or any data)+"%'

これにより、テキストボックスの文字または数字で始まるそのフィールドのすべてのデータ、または必要なものがすべて得られます

例:- t と入力すると、t ティー ティシャが得られます

他の数字も 1 を入力してください u will gwt 1 112 1 13

于 2012-06-15T09:51:51.157 に答える