我一直在尝试实施基于标签的搜索,用户可以使用运算符&amp ;;来键入一系列标记。 |而且!以及对搜索术语进行分组的能力[即(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&lt;&gt;以来,我的SQL显然是业余和错误的。 'Y'我想要返回对象1和2,但我收到1,2和3,因为存在对象3没有链接到Y的键。
我对(tagName ='X'&amp; tagName ='Y')的搜索没有返回任何内容,我知道这样做的原因是没有出现标记X和Y同时链接的对象时间...
所以,因此,我正在寻找解决问题的一些指导。
考虑搜索,类似的问题,解决方案(?),替代解决方案(?如果我的解决方案不是解决此问题的最佳方式)。
由于
答案 0 :(得分:1)
我认为您可以完成实现Binary Expression Tree的问题的解决方案,然后给定该结构,您可以从最左边的节点开始创建SQL(事实上,您必须按顺序使用,根据您的表达格式下订单或预订。)
其他解决方案,有点复杂,可以与词法分析器和解析器一起使用,生成自己的语法。read this
作为您的其他问题,您首先必须定义哪个运营商'&amp;'会做.. tagname ='X'&amp; tagname ='Y'表示该项目至少包含这两个标签,而该项目不能包含X或Y标签。