搜索关键字并忽略来自datafeed的关键字

时间:2015-07-22 09:59:21

标签: php mysql

我的情况是,我需要将数据库中的产品与来自数据源的产品进行匹配。

数据源有一个产品名称列。

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

匹配应该是这样的:如果 ALL db KEYWORDS匹配数据源产品名称并且db IGNORE_KEYWORDS的 NONE 与数据源产品名称匹配,那么它是正的匹配。

例如

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

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

before_script:
- mkdir -p $HOME/.sbt/launchers/0.13.8/
- curl -L -o $HOME/.sbt/launchers/0.13.8/sbt-launch.jar http://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.8/sbt-launch.jar

问题是使用直接查询很难匹配datafeed product-name中数据库列的ALL KEYWORDS。我认为它甚至不可能!但可能有一些直接的方法来做到这一点。

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

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

我创建了两个新表:

product_keywords
id | keyword | tot_kwds

product_ignore_keyword
id | keyword
  • 首先,我从search-source-string

  • 中提取单词
  • 接下来,我使用此查询来获取匹配的记录:

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

  • 这样,我得到了包含search-source-string中所有关键字的ID。我们将它们命名为keyword-found-ids

  • 接下来,我将获得忽略关键字地图中的ID:

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

  • 现在我获得了关键字中的ID,但也在忽略关键字中找到了这些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];

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

干杯