【问题标题】:SQL - Search for exact word match in any orderSQL - 以任何顺序搜索完全匹配的单词
【发布时间】:2017-06-25 09:31:08
【问题描述】:

我花了一整天的时间来寻找这个问题的答案,并且已经下定决心,在 3 种不同的搜索引擎变体之后这是不可能的。这是我的问题。我需要搜索打印机型号表。由于打印机型号没有标准化,型号的不同部分可能有不同的顺序。

HP OfficeJet Pro 8715

HP OfficeJet 8715 Pro

显然两者都是同一台打印机,但它们以两种方式出现在我们和供应商之间的共享数据库中。问题是,如果我搜索 HP OfficeJet Pro 8715,它也应该返回 HP OfficeJet 8715 Pro,但它不应该返回 HP OfficeJet Pro 8715dw > 例如。

总而言之,单词可以按任意顺序排列,但单词必须完全匹配。

我已经将搜索字符串解析为#temp 表,以便每一行都有一个单词,这就是我一直在比较查找结果的方式。

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
        WHERE ( Make LIKE '%' + @MAKE + '%' ) AND ( Model LIKE '%' + @MODEL + '%' ) AND ( Model LIKE '%' + @MODEL2 + '%' )

其中每个模型变量都是模型中的另一个词。这很好用,但返回 HP OfficeJet Pro 8715 以及 HP OfficeJet Pro 8715dw

这可能吗?

谢谢

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 如果 Make 总是在开头,只需明确检查 Model 中单词顺序的所有排列?
  • 你能回答这个问题吗?这最终成为我们的最佳解决方案。

标签: sql search


【解决方案1】:

它返回 8715dw,因为 %(anything 运算符)允许它。

尝试不使用 %s:

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
        WHERE ( Make LIKE @MAKE ) AND ( Model LIKE @MODEL ) AND ( Model LIKE  @MODEL2 )

更新(基于https://stackoverflow.com/a/14291100/510788):

SELECT * FROM
  (SELECT Make, CONCAT(' ', REPLACE(Model,' ','  '), ' ') AS Model FROM tDevices) t
WHERE
   Make  LIKE '%hp%' AND (
       Model LIKE '% 8715 %' OR
       Model LIKE '% pro %' AND
       (REPLACE(REPLACE(Model,
       ' 8715 ',''),
       ' pro ','')) = ''
   )

【讨论】:

  • 关键是没有 %s,搜索不再忽略模型的位置,对吧?
  • 是的,但我没有考虑清楚,抱歉。请参阅我的更新以获得更好的解决方案。
  • 非常有趣。它不会解决整个问题(因为看起来搜索中会包含其他单词)但我明白你的意思,这正是我在查询的第一部分所需要的。谢谢!我会让它工作并给你一个答案!
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多