在MySQL中搜索短语关键字

2024-04-18 20:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有两列的表:ID(主键,自动递增)和keyword(文本,全文索引)。 在keyword列中输入的值包括: 关键字

  • 汽车
  • 汽车销售
  • 汽车
  • 跑车
  • 体育食品
  • 汽车酒吧
  • 统计学

假设我们将以下句子作为输入:

"Find sports car sales statistics in Manhattan."

我正在寻找(我已经搜索了很长一段时间)寻找一个MySQL查询或一个算法,它接受给定的输入,并检测keywords列中使用的关键字,结果是:

^{pr2}$

换句话说,我试图以句子的形式输入,然后匹配数据库中在句子中找到的所有现有(和最相关的)关键字值。请注意,这些关键字可以是由空格分隔的单词组成的短语。在

经过研究,我知道MySQL通过它的全文搜索功能也做了类似的工作。我尝试过所有的自然语言、布尔和查询扩展选项,但是它们包含的关键字记录只有一半内容与输入匹配。例如,它输出:

"Car", "Car sales", "Sports cars", "Sports foo", "Cars bar", "Statistics".

我不希望这种情况发生,因为它包含的单词甚至不在输入中(例如foo和bar)。在

下面是针对上述搜索的MySQL查询:

SELECT * FROM tags WHERE MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE)

我还试图改进相关性,但这一条只返回一条记录:

SELECT *, SUM(MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE)) as score FROM tags WHERE MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE) ORDER BY score DESC

Tags: inmatchmysql关键字findcar汽车keyword
1条回答
网友
1楼 · 发布于 2024-04-18 20:18:58

如果我们假设您在列表中以python方式为此类任务提供列,那么可以使用set.intersection来获得两个集合之间的交集(第二个元素可以是另一个iterable,如list或tuple):

>>> col={'Car','Car sales','Cars','Sports cars','Sports foo','Car bar','Statistics'}
>>> col={i.lower() for i in col}
>>> s="Find sports car sales statistics in Manhattan."
>>> col.intersection(s.strip('.').split())
set(['car', 'statistics'])

在您的例子中,您可以将查询结果放在set中,或者将其转换为set。在

注意:如果列为小写,以下集合理解将转换元素:

^{pr2}$

但是这个方法将找到列与拆分字符串之间的交集,并使用空格。所以结果是:

set(['car', 'statistics'])

作为另一种使用re.search的方法:

>>> col={'Car','Car sales','Cars','Sports cars','Sports foo','Car bar','Statistics'} 
>>> s='Find sports car sales statistics in Manhattan.'
>>> for i in col:
...    g=re.search('{}'.format(i),s,re.IGNORECASE)
...    if g:
...      print g.group(0)
... 
statistics
car sales
car

作为一种简单的方法,您可以使用以下函数来获取短语的组合:

from itertools import permutations
def combs(phrase):
    sp=phrase.split()
    com1=[map(lambda x:' '.join(x),li) for li in [permutations(sp,j) for j in range(1,len(sp)+1)]]
    for i,k in enumerate(sp):
          if not k.endswith('s'):
             sp[i]=k+'s'
    com2=[map(lambda x:' '.join(x),li) for li in [permutations(sp,j) for j in range(1,len(sp)+1)]]
    return com1+com2

print {j for i in combs('Car sales') for j in i}
set(['Car', 'sales', 'sales Cars', 'Car sales', 'Cars sales', 'sales Car', 'Cars'])

请注意,此功能可能更高效、更完整。在

相关问题 更多 >