我的情况是,我需要将数据库中的产品与来自数据源的产品进行匹配。
数据源有一个产品名称列。
虽然我的数据库表有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?
进行此类匹配的最快和最优化的方法是什么?
提前致谢!
答案 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
这种方法对我很有用!
以下是示例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];
我会等待任何建议,以进一步优化这个答案。如果没有,那么我会将其标记为已接受的答案。
干杯