有一种情况是,我需要将数据库中的产品与来自datafeed的产品进行匹配。
datafeed有一个产品名列。
而我的数据库表有关键字和IGNORE_KEYWORDS列。
如果所有的 db关键字都匹配datafeed产品名称,而db IGNORE_KEYWORDS的NONE匹配datafeed产品名称,则匹配应该是正匹配。
例如:
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问题是,使用直接查询将很难匹配datafeed产品名称中数据库列中的所有关键字。我认为这是不可能的!但也许有一些直接的方法来做到这一点。
如果不是直接的方法,那还会有间接的方法吗?比如创建另一个表来保存数据库原始表的关键字和ids?
--做这种匹配的最快和最优化的方法是什么?
提前感谢!
发布于 2015-07-25 07:44:30
通过使用以下方法,我终于能够做到这一点:
我创建了两个新表:
product_keywords
id | keyword | tot_kwds
product_ignore_keyword
id | keywordselect id, tot_kwds from product_keywords where keyword in ('word1', 'word2', 'word3') group by id having count(*) = tot_kwds
keyword-found-idsselect id from product_ignore_keywords where id in (keyword-found-ids) and keyword in ('word1', 'word2', 'word3')
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];我将等待任何建议,以进一步优化这一答案。如果没有答案,我将把它标记为已接受的答案。
干杯
https://stackoverflow.com/questions/31559865
复制相似问题