【问题标题】:Keyword search using PHP MySql?使用 PHP MySql 进行关键字搜索?
【发布时间】:2010-11-02 02:18:45
【问题描述】:

我的 mysql 表中有标题 (varchar)、描述 (text)、关键字 (varchar) 字段。

我保留了关键字字段,因为我认为我只会在此字段中搜索。但我现在需要在所有三个字段中进行搜索。所以对于关键字“word1 word2 word3”,我的查询变成了

SELECT * FROM myTable
WHERE (
name LIKE '%word1%' OR description LIKE '%word1%' OR keywords LIKE '%word1%' 
OR name LIKE '%word2%' OR description LIKE '%word2%' OR keywords LIKE '%word2%' 
OR name LIKE '%word3%' OR description LIKE '%word3%' OR keywords LIKE '%word3%') 
AND status = 'live'

看起来有点乱,但这很管用。但现在我需要实现同义词搜索。因此,对于给定的单词,假设有几个可用的同义词,当我遍历所有单词时,这个查询会变得更加混乱。随着要求越来越明确,我还需要将此 myTable 加入到其他一些表中。

所以

  • 你觉得上面的方式比较乱,随着数据的增长会出问题吗?

  • 如何避免上述混乱?我可以通过任何更清洁的解决方案吗?任何例子都会对我有所帮助。

  • 您还有其他方法/技术可以推荐给我吗?

感谢

编辑

@Peter Stuifzand 建议我可以创建一个 search_index 表并在其上存储所有 3 个字段(标题、关键字、描述)信息并进行全文搜索。我知道,该表还将包括对 myTable 主键的引用。

但我的高级搜索可能包括将 mytable 与 Category 表、geographic_location 表(用于在 10、20 英里等范围内搜索)、按其他条件过滤,当然还有对搜索结果进行排序。你觉得用mysql全文不会拖慢吗?

【问题讨论】:

    标签: php mysql search


    【解决方案1】:

    当您的查询失控时,有时最好用 SQL 编写部分查询,而用您选择的编程语言编写其他部分。

    您还可以使用全文搜索进行搜索。您可以使用要搜索的所有字段创建单独的表并添加 FULLTEXT 修饰符。

    CREATE TABLE `search_index` (
        `id` INT NOT NULL,
        `data` TEXT FULLTEXT,
    );
    
    SELECT `id` FROM `search_index` WHERE MATCH(`data`) AGAINST('word1 word2 word3');
    

    【讨论】:

    • hmm .. 我记得我不久前做过这样的事情。谢谢你提醒我。我会认真考虑的。谢谢
    【解决方案2】:

    另一种方法(有时更好,但取决于...)

    SELECT 
        id, name, description, keywords 
    FROM 
        myTable
    WHERE
        name REGEXP '.*(word1|word2|word3).*' OR
        description REGEXP '.*(word1|word2|word3).*' OR
        keywords REGEXP '.*(word1|word2|word3).*'
    ;
    

    PS:但MATCH(cols) AGAINST('expr') 可能更适合您的情况。

    【讨论】:

      【解决方案3】:

      如果可能,您应该查看fulltext search

      【讨论】:

      • 我确实查看了 mysql 全文。事实上,我首先使用全文方法并切换到此方法,因为我在某处读到如果您使用其他索引(如 status ='something' 等)并与全文连接它会变得很慢等。感谢您的回复。
      【解决方案4】:

      考虑到扩展的要求,您可能需要考虑使用 apache solr(请参阅http://lucene.apache.org/solr/),它是一个多面搜索引擎,专为全文搜索而设计。它有一个可以返回 XML 或 JSON 的 RESTful 接口。我在几个项目中使用它 - 效果很好。

      我看到您遇到一些问题的唯一领域可能是邻近搜索,但有一些用于构建查询的额外逻辑它应该可以工作。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 2013-04-08
        • 1970-01-01
        • 2011-09-28
        • 2022-01-14
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        相关资源
        最近更新 更多