【问题标题】:PHP/MySQL complex search with more than one keywords包含多个关键字的 PHP/MySQL 复杂搜索
【发布时间】:2012-01-13 10:57:21
【问题描述】:

我最难使用 php(或 mysql)搜索功能。 我愿意为此购买一个脚本,但我找不到。

我有一张客户表(名字、姓氏、街道、邮编、城市等......) 而且我希望不仅能够查找一个关键字,而且能够查找 2 IN 2 DIFFERENT 列。

例如:

关键字:“John Doe”

所以我的尝试是。

SELECT ....
   WHERE CONCAT(firstname,lastname) LIKE '%john%'
   AND CONCAT(firstname,lastname LIKE '%doe%'

但是:这给了我所有的 johns 和 doe,并且 John Doe 先生在该列表中的某个位置,但不是最重要的,即使它应该是最相关的结果。

我也试过了:

....
   WHERE MATCH(firstname,lastname) AGAINST('%john doe%')

这几乎可以得到相同的结果。

所以我正在寻找的结果是:

1. John Doe (at first position!)
2. John Miller
3. John Smith
4. Harry Doe
5. Jack Doe
etc......

我一直在寻找 2 个小时,但我拒绝相信我是第一个尝试这样做的人 :-)

感谢任何帮助!

谢谢!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    你是否也尝试过这样的事情

    SELECT MATCH(firstname, lastname) AGAINST ('john doe') as Relevance 
    FROM table WHERE MATCH(firstname, lastname) AGAINST('john doe' IN
    BOOLEAN MODE) 
    HAVING Relevance > 0.3
    ORDER BY Relevance DESC
    

    另见

    http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

    这也可能是一个解决方案:

    SELECT MATCH(firstname) AGAINST ('john doe') as firstname_relevance, 
        MATCH(lastname) AGAINST ('john doe') as lastname_relevance
        FROM table WHERE MATCH(firstname, lastname) AGAINST('john doe' IN
        BOOLEAN MODE) 
        ORDER BY firstname_relevance+lastname_relevance DESC
    

    【讨论】:

    • 但 john doe 仍然不在第一位置。还有其他一些具有更高相关性的“doe”。我有点不明白
    • 能否发布相关行显示的顺序?我还修改了查询以排除 % 符号,据我所知查询中的通配符是 *
    • 乌特施密特 4.70247888565063 保罗施密特 4.70247888565063 乌韦施密特 4.70247888565063 伊娃施密特 4.65077877044678
    • #1191 - 找不到与列列表匹配的 FULLTEXT 索引我的全文索引包含两行。有错吗?
    • 您可能还需要为备用解决方案添加两个其他索引。每列一个。
    【解决方案2】:

    像这样?

    SELECT
       firstname, lastname, othercol, MIN(Weighting)
    FROM
        (
        SELECT firstname, lastname, othercol, 1 AS Weighting FROM...
        WHERE firstname = 'john' AND lastname  = 'doe'
        UNION ALL
        SELECT firstname, lastname, othercol, 2 AS Weighting FROM...
        WHERE firstname = 'john' OR lastname  = 'doe'
        ) T
    GROUP BY
       firstname, lastname, othercol
    ORDER BY
       MIN(Weighting) DESC;
    

    【讨论】:

    • 是的,但是如果有人输入“doe john”怎么办?
    • @Roman Klare:然后更新您的问题。我回答了你的问题
    【解决方案3】:

    布尔模式不会自动按相关性递减的顺序对行进行排序,因此您必须:

    SELECT MATCH(firstname,lastname) AGAINST('john doe') as Relevance FROM table WHERE MATCH
    MATCH(firstname,lastname) AGAINST('john doe'  IN 
    BOOLEAN MODE) ORDER 
    BY Relevance DESC
    

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 2018-12-16
      • 2011-09-28
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多