我一直在尝试实现基于标签的搜索,用户可以使用运算符 & | 键入标签字符串。和 !以及对搜索词进行分组的能力 [即 (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
但是,我注意到一些问题并正在寻找指导:
首先,我一直在搜索和搜索讨论这个问题、这个问题的解决方案等的资源。然而,我最大的问题是我不知道最好的搜索是什么......我确信这类问题有一个名字,总是有的。
其次,我的 SQL 显然是业余和错误的,因为搜索 tagName <> 'Y' 我想返回对象 1 和 2,但我收到 1、2 和 3,因为对象 3 没有链接到 Y 的键。
我对 (tagName = 'X' & tagName = 'Y') 的搜索没有返回任何结果,我知道这样做的原因是标签 X 和 Y 同时链接的对象没有出现......
因此,因此,我正在寻找一些指导来解决我的问题。
想寻找类似的问题,解决方案(?),替代解决方案(?如果我的解决方案不是解决此问题的最佳方法)。
谢谢