【问题标题】:search keywords and ignore keywords from datafeed搜索关键字并忽略数据馈送中的关键字
【发布时间】:2015-07-22 09:59:21
【问题描述】:

我需要将数据库中的产品与来自数据馈送的产品进行匹配。

数据馈送有一个产品名称列。

虽然我的数据库表有 KEYWORDS 和 IGNORE_KEYWORDS 列。

匹配应该是这样的,如果 ALL db KEYWORDS 匹配数据馈送产品名称并且 NONE db IGNORE_KEYWORDS 匹配数据馈送产品名称,那么它是肯定的匹配。

例如

Datafeed:

ID, Name, Url, ...
1, iPhone 5s 64GB Unlocked 1 year warranty, http://....
2, iPhone 5s 64GB Locked O2 2 years Deal, http://....

Database:
ID, KEYWORDS, IGNORE_KEYWORDS, ...
1000, iPhone 5s 64GB, Locked, ...
1001, iPhone 5s 64GB, Unlocked, ...

现在当我匹配时,它应该匹配:

Datafeed #1 to Database #1000
Datafeed #2 to Database #1001

问题是使用直接查询很难匹配数据馈送产品名称中数据库列中的所有关键字。我认为这甚至是不可能的!但是可能有一些直接的方法可以做到这一点。

如果不是直接方法,那么是否有间接方法?像创建另一个表来保存数据库原始表的关键字和ID?

进行这种匹配的最快和最优化的方法是什么?

提前致谢!

【问题讨论】:

  • 唯一的方法是将关键字移动到单独的表格中,每行一个关键字。然后您就可以对它们执行查询。单个查询是不可能的,但至少它是可能的。
  • 感谢您的回复。这里重要的是特定产品的所有关键字都与单个数据馈送产品名称匹配。所以如果例如。 iPhone-10005s-1000 匹配但64GB-1000 不匹配,则表示产品ID 1000 不匹配。我们该怎么做?
  • 我猜这种匹配需要一个不同的检查和一个count(*)测试来验证产品的所有关键字都匹配???有什么简单的方法吗?
  • SELECT COUNT(*) FROM my_keywords WHERE value IN ('iPhone-1000', '5s-1000', ' 64GB-1000') 然后你会检查计数是否为 3。
  • 我想应该是这样的:SELECT count(*), id FROM my_keywords WHERE keyword IN ('iPhone', '5s', '64GB') GROUP BY id。所以这将返回所有带有计数的产品 id,我们选择那些匹配所有 3 的产品,对吗?我想如果我们的关键字和搜索词确保是唯一的,这将起作用。

标签: php mysql


【解决方案1】:

我终于可以通过以下方法做到这一点:

我创建了两个新表:

product_keywords
id | keyword | tot_kwds

product_ignore_keyword
id | keyword
  • 首先我从搜索源字符串中提取单词

  • 接下来我使用这个查询来获取匹配的记录:

select id, tot_kwds from product_keywords where keyword in ('word1', 'word2', 'word3') group by id having count(*) = tot_kwds

  • 这样,我得到了在搜索源字符串中包含所有关键字的 id。让我们将它们命名为keyword-found-ids

  • 接下来我获取在忽略关键字映射中找到的 id:

select id from product_ignore_keywords where id in (keyword-found-ids) and keyword in ('word1', 'word2', 'word3')

  • 现在我得到了那些在关键字中找到但也在忽略关键字中找到的 ID,比如 ignore-keyword-found-ids

  • 所以我的最终结果是这样的:

keyword-found-ids - ignore-keyword-found-ids

  • 我从这个最终结果中获取第一个 id,这就是我们正在寻找的匹配产品。

这个方法对我很有效!

这里是示例 php 代码:

$arrW = getWordsFromString($searchString);

if ( !is_array($arrW) || count($arrW) == 0 )
    return 0;

$pids = array();
$sql = "select id, tot_kwds from product_keywords where keyword in ('".implode("', '", $arrW)."') group by id having count(*) = tot_kwds";
$res = db_query($sql);
while ( ($row = db_row($res)) )
    $pids[] = (int)$row['id'];

if ( count($pids) == 0 )
    return 0;

$nids = array();
$sql = "select id from product_ignore_keywords where id in (".implode(', ', $pids).") and keyword in ('".implode("', '", $arrW)."')";
$res = db_query($sql);
while ( ($row = db_row($res)) )
    $nids[] = (int)$row['id'];

$pids = array_diff($pids, $nids);

if ( count($pids) == 0 )
    return 0;

$finalId = (int)$pids[0];

我将等待任何建议以进一步优化此答案。如果没有,我会将其标记为已接受的答案。

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多