首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据流中搜索关键字和忽略关键字

从数据流中搜索关键字和忽略关键字
EN

Stack Overflow用户
提问于 2015-07-22 09:59:21
回答 1查看 96关注 0票数 1

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

datafeed有一个产品名列。

而我的数据库表有关键字和IGNORE_KEYWORDS列。

如果所有的 db关键字都匹配datafeed产品名称,而db IGNORE_KEYWORDS的NONE匹配datafeed产品名称,则匹配应该是正匹配。

例如:

代码语言:javascript
复制
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, ...

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

代码语言:javascript
复制
Datafeed #1 to Database #1000
Datafeed #2 to Database #1001

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

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

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-25 07:44:30

通过使用以下方法,我终于能够做到这一点:

我创建了两个新表:

代码语言:javascript
复制
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

  • 这样,我就可以获得in,其中包含搜索源字符串中的所有关键字。让我们给他们取名为keyword-found-ids
  • 接下来,我获得了在忽略关键字映射中找到的I:

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

  • 现在我得到了那些在关键字中找到的I,但是在忽略关键字中也找到了这些I,比如ignore-keyword-found-ids
  • 所以我的最后结果是:

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

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

这个方法对我很管用!

下面是示例php代码:

代码语言:javascript
复制
$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];

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

干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31559865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档