【问题标题】:Implementing a tag search with operands使用操作数实现标签搜索
【发布时间】:2013-03-07 01:57:10
【问题描述】:

我一直在尝试实现基于标签的搜索,用户可以使用运算符 & | 键入标签字符串。和 !以及对搜索词进行分组的能力[即(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 同时链接的对象没有出现...

所以,从今往后,我正在寻找一些指导来解决我的问题。

考虑搜索类似问题、解决方案(?)、替代解决方案(?如果我的解决方案不是解决此问题的最佳方法)。

谢谢

【问题讨论】:

    标签: sql search web tags operators


    【解决方案1】:

    我认为您可以通过实现Binary Expression Tree 来解决您的问题,然后根据该结构,您可以从最左边的节点开始创建 SQL(实际上,您必须使用 inorder、post-根据您的表达格式订购或预订)。

    其他稍微复杂一点的解决方案可以使用词法分析器和解析器,生成您自己的语法。read this

    作为您的其他问题,您首先必须定义运算符 '&' 会做什么.. tagname = 'X' & tagname = 'Y' 表示该项目至少有这两个标签,而不是该项目可能有X 或 Y 标记。

    【讨论】:

    • 谢谢,这就是我要找的。我发现这篇文章应该对我的实施有所帮助:www.codeproject.com/Articles/198236/Boolean-text-search-queries-and-their-processing 这看起来是一项艰巨的任务,与此同时我有一直在处理我的 SQL 语句,这些语句也变得非常庞大......
    • 但是,我也发现了这个:tagging.pui.ch/post/37027745720/tags-database-schemas 这似乎提供了更简单的方法来实现我的目标,而实际上与博客是通过标签检索的。我想我会尝试这个版本,因为我热衷于实现一些东西 :) 感谢您帮助我找到答案!
    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多