【问题标题】:Mysql full text search ignore repeated words take word at onceMysql全文搜索忽略重复词一次取词
【发布时间】:2011-09-14 09:40:32
【问题描述】:

我需要 mysql 全文搜索方面的帮助。 我正在寻找名为梦想的书。当我寻找我得到的梦想时

  1. 我梦想中的印度是所有梦想中最伟大的愿景
  2. 梦的字典 - 理解梦
  3. 关于梦想和超越梦想的心理
  4. 没有梦想
  5. 只有梦想
  6. 梦想
  7. 其他一些书

其实我在寻找梦想 如何将第 6 本书变成第 1 本书。

我想在这种情况下忽略重复的单词梦想

你可以搜索here

我在不同的标题中都面临着这类问题。

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    与重复搜索词的列的相关性最高,我能看到的唯一解决方案是使用标准全文搜索进行联合查询以完全匹配,例如:

    SELECT * FROM books 
    WHERE title = 'Dreams'
    UNION
    SELECT * FROM books
    WHERE MATCH(title) AGAINST("Dreams")
    

    这将首先显示完全匹配。

    或者你可以

    SELECT * FROM books
    WHERE MATCH(title) AGAINST("Dreams")
    ORDER BY (CASE WHEN title = 'Dreams' THEN 1 ELSE 0 END),.....
    

    【讨论】:

    • 您好,感谢您的回答。这会很有帮助。问题是性能。我们有1000万本书。我以前尝试过联合..执行搜索需要很长时间..单个查询中有没有其他选择..
    • 为了加快联合中的平等检查,您可以在标题上添加标准索引,但解决方案可能是您最好的选择。
    【解决方案2】:

    您希望确切的案例成为第一个建议吗?

    按顺序尝试:

    "ORDER BY ('{$str_search}' = title) DESC"
    

    这将使您搜索的确切大小写搜索词首先出现。

    另外2个解决方案:

    "ORDER BY ('{$str_search}' LIKE title) DESC"
    "ORDER BY ('{$str_search}%' LIKE title) DESC"
    

    第三种解决方案可用于对所有以搜索词开头的内容进行排序。

    注意:此解决方案与 CASE WHEN 几乎相同。

    【讨论】:

      【解决方案3】:

      可能不再相关,但如果有人来看,我会建议使用顶部的 levenshtein 函数来解决这个问题。有关更多信息和 mysql 中的完整实现,请参见下文

      https://dba.stackexchange.com/questions/40450/mysql-full-text-search-increase-relevance-for-exact-matches

      Levenshtein: MySQL + PHP

      【讨论】:

        【解决方案4】:

        我只能建议使用正则表达式: http://dev.mysql.com/doc/refman/5.1/en/regexp.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多