gpt4 book ai didi

php - 在可变数量的参数上搜索表多列

转载 作者:行者123 更新时间:2023-11-30 21:46:48 24 4
gpt4 key购买 nike

我有一个搜索输入框,用户可以在其中输入一个或多个单词,php 脚本应该返回所有这些单词包含在任何列中的所有行。

假设有这样一张表:

|car_id|make|model|year|plate|
+----------------------------+
| 1 |Audi|A4 |2010|AAAAA|
| 2 |Audi|A4 |2012|AAAAB|
| 3 |Audi|Q5 |2010|AAAAC|
+----------------------------+

如果用户输入“Aud”,他将获得 3 行。如果输入“2010 Audi”,他得到第 1 行和第 3 行,如果输入“Aud q5 2010”,他只得到第 3 行。

我做了什么。

如果输入只有 1 个术语,我可以构建一个类似

的查询
SELECT * FROM car WHERE make LIKE '%term%' OR model like '%term%' OR year like '%term%'

如果用户输入 2 个术语,我必须改为创建此查询(甚至不考虑车牌列)

SELECT * FROM car WHERE 
(make LIKE '%term%' AND model LIKE '%term2%')
OR (make LIKE '%term2%' AND model LIKE '%term%')
OR (make LIKE '%term%' AND year LIKE '%term2%')
OR (make LIKE '%term1%' AND year LIKE '%term%')
OR (model LIKE '%term%' AND year LIKE '%term%')
OR (model LIKE '%term2%' AND year LIKE '%term1%')

如果用户输入 3 个术语,查询会变得更加复杂。

我阅读了有关 MATCH 关键字的信息,但有些列不是文本,例如本例中的年份。

进行这种搜索的正确方法是什么?我应该更改数据库模式吗?将所有可搜索的列连接成一个字符串并做一些正则表达式,

谢谢。

最佳答案

  1. 创建一个额外的列,all。让它包含您需要搜索的所有列的 CONCAT_WS(' ', ...)
  2. 在该列上创建一个 FULLTEXT(all) 索引。
  3. 只用一个子句构建查询:

    WHERE MATCH(all) AGAINST("+Audi +q5 +2010"IN BOOLEAN MODE)

问题:

  • FULLTEXT 有最小字长;要么改变它(唉,这是一个全局性的环境),要么以不同的方式处理短“词”。例如,如果最小单词 len 是 3,则删除 AGAINST 字符串中“q5”之前的“+”。否则,InnoDB 将找不到任何行。
  • 类似地处理“停用词”。或者删除停止列表。
  • 以某种方式处理连字符等单词。
  • 执行 ORDER BY MATCH ... LIMIT 20 可能有助于 (1) 对奇怪的情况给予一些偏好,以及 (2) 在用户没有指定足够的情况下限制输出。
  • 或者您可能想公平竞争并执行 ORDER BY RAND() LIMIT 20

如果您使用的是 5.7 或 MariaDB,“生成的”列可能会有用。

关于php - 在可变数量的参数上搜索表多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com