1

私は、ユーザーが演算子&|を使用してタグの文字列を入力できるタグベースの検索を実装しようとしています。と !検索語をグループ化する機能[すなわち(X&Y)|!Z]とともに。私の計画は、そこにある短い文字列を、特定のタグにリンクされているオブジェクトを検索する可能性のある完全なSQLクエリに変換できるようにすることです。

object    >--<    tags
object -< bond >- tags

 -----------    -----------------------    ------
| object    |  | bond                  |  | tag  |
 -----------    ---- -------- ---------    ------ 
| Id | Name |  | Id | textId | tagName |  | Name |
 ---- ------    ---- -------- ---------    ------ 
| 1  | A    |  | 1  | 1      | V       |  | V    |
| 2  | B    |  | 2  | 1      | W       |  | W    |
| 3  | C    |  | 3  | 1      | X       |  | X    |
 ---- ------   | 4  | 2      | Z       |  | Y    |
               | 5  | 3      | V       |  | Z    |
               | 6  | 3      | W       |   ------
               | 7  | 3      | X       |
               | 8  | 3      | Y       |
                ---- -------- ---------

SEARCH: 
    (X&Y)|Z

QUERY:{
    SELECT *
    FROM object
    WHERE object.id = bond.textId
    AND (
        (bond.tagName = 'X' AND bond.tagName = 'Y')
        OR bond.tagName = 'Z'
    )

RETURN: 
    2 | B
    3 | C

クエリをコンパイルするために次のように記述しました http://jsfiddle.net/wP7JR/1/

そして、私のクエリをテストするために以下 http://sqlfiddle.com/#!2/139ca/3/0

しかし、私はいくつかの問題に気づき、ガイダンスを探しています。

  • 何よりもまず、私はこの問題、この問題の解決策などを議論するリソースを検索して探してきました。しかし、私の最大の問題は、最良の検索が何であるかわからないことです...このタイプの問題には名前があると確信しています。常にあります。

  • 次に、tagName <>'Y'を検索すると、オブジェクト1と2を返したいのですが、オブジェクト3がYにリンクされていない結合があるため、代わりに1、2、3を受け取ります。

  • (tagName ='X'&tagName ='Y')を検索しても何も返されません。これは、タグXとYが同時にリンクされているオブジェクトが発生しないためです。

それで、今後、私は自分の問題を解決するための少しのガイダンスを探しています。

同様の問題、解決策(?)、代替解決策(?私のものがこの問題を解決する最適な方法ではない場合)を検索することを考えています。

ありがとう

4

1 に答える 1

1

バイナリ式ツリーを実装する際の問題の解決策を達成でき、その構造が与えられれば、最も左のノードからSQLの作成を開始できると思います(実際には、順序付け、順序付け後、または事前順序付けを使用する必要があります) -式の形式に従って並べ替えます)。

もう少し複雑な他の解決策は、レクサーとパーサーを使用して、独自の文法を生成することです。これを読んでください

他の質問と同様に、最初に演算子'&'が何をするかを定義する必要があります。tagname='X'&tagname ='Y'は、アイテムに少なくともこれら2つのタグがあり、そのアイテムにXまたはYがないことを意味します。鬼ごっこ。

于 2013-03-18T17:15:27.463 に答える