【问题标题】:MySQL full text search in boolean mode order by relevanceMySQL 全文搜索以布尔模式按相关性排序
【发布时间】:2020-03-28 18:02:00
【问题描述】:

我正在尝试在 MySql 中以布尔模式构建全文搜索。

首先我尝试了这个,因为我读到如果你使用 WHERE,它将自动按相关性返回结果:

SELECT DISTINCT word1, lang1, lang2, row_type FROM translations WHERE MATCH (word1) AGAINST ('$search' IN BOOLEAN MODE)

因此不会发生按相关性排序。 然后我尝试了以下方法:

$sql = "SELECT *, MATCH(word1) AGAINST ('$search' IN BOOLEAN MODE) AS relevance FROM `translations` WHERE MATCH(word1) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY relevance DESC";

这只是根据匹配的单词数对匹配项进行排名,然后按 ID 号列出它们。除了匹配的词数之外,没有相关性搜索。

例如,如果我搜索“红色汽车”一词,它会返回:

1. red car is nice
2. red car
3. the car has a very nice color
4. car

我希望“汽车”这个词出现在“汽车的颜色很漂亮”之前

使用 BOOLEAN MODE 时的相关数字是表示匹配单词数的整数。

当我使用自然语言模式时,相关数字是精细的十进制数字,并且相关搜索工作正常。

如何在 BOOLEAN MODE 中获得真正相关的结果列表?

【问题讨论】:

    标签: mysql boolean relevance


    【解决方案1】:

    首先,您希望按相关性进行排序。 你期望所有的信息 你能试试吗 SELECT * FROM TEST_BOOLEAN WHERE ID_1;

    【讨论】:

      【解决方案2】:

      你的 MySQL 版本是多少?

      我确实记得它在布尔模式下没有任何相关性。这只是 TRUE/FALSE (1/0)。我以前在 WHERE 子句中使用布尔模式,在 SELECT/ORDER 子句中使用自然语言模式。

      你也可以尝试做这样的事情:

      SET @search = 'red car';
      
      SELECT
            *
          , MATCH(word1) AGAINST (@search IN BOOLEAN MODE) AS relevance
      FROM
          translations
      WHERE
          MATCH(word1) AGAINST (@search IN BOOLEAN MODE)
      ORDER BY
            relevance DESC
          , LENGTH(word1) ASC
      ;
      

      因此,如果两条记录具有相同的相关性,则较短的一条将是第一个。

      【讨论】:

      • MySQL 55.7.23,您的解决方案是我不得不求助的解决方案,尽管我希望有更优雅的可能性。
      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多