如何对SQL中多个字段的搜索进行排序和过滤

q

我有一个带有音乐歌曲的SQL数据库。当然,每首歌曲都有一个艺术家,一张专辑和一个流派。它们还具有一个通用的“受欢迎程度”计数器,该计数器是从外部来源获得的。但是,我也想给用户提供对歌曲进行投票的机会。最后,搜索结果应以此受欢迎程度排序,以及原始查询结果的准确性。

我使用的当前查询如下:

SELECT *
FROM p2pm_tracks
WHERE
 `artist` LIKE '%$searchquestion%' OR
 `genres` LIKE '%$searchquestion%' OR
 `trackname` LIKE '%$searchquestion%' OR
 `album_name` LIKE '%$searchquestion%'
ORDER BY `popularity` DESC
LIMIT $startingpoint, $resultsperpage

我在以下方面感到挣扎:

  1. 用户搜索内容。我关注所有领域:歌曲标题艺术家专辑流派但是,通常某个搜索查询包含这些曲目的多个(部分)。

例如,用户可能搜索Opening Philip Glass

在这种情况下,第一个单词是歌曲名称,第二个和第三个单词是歌手的名称

另一个例子:

如果我在空格上拆分查询,则会找到正确的轨道。但是,如果另一条仅与这些单词中的一个匹配的曲目具有较高的知名度,则会在实际与搜索查询准确匹配的曲目之前返回该曲目。

我仍然希望对结果进行排序,以使一次与查询的较大部分匹配的事物位于顶部。如何使用SQL做到这一点?

  1. 我的静态人气很高,想创建一个新的人气。因此,我想使用某个轨道上所有选票的平均值(这些选票存储在另一个表中),除非还没有选票。我该如何构造一个执行此操作的SQL查询?

我的应用程序是用PHP构建的,但是我想在SQL中尽可能多地执行此操作,最好在尽可能少的查询中执行以减少延迟。

任何帮助,将不胜感激。

威萨姆·埃尔基克

您可以为搜索结果中的每一列添加权重。

这是代码:

SELECT *,
    CASE WHEN `artist` LIKE '%$searchquestion%' THEN 1 ELSE 0 END AS artist_match,
    CASE WHEN `genres` LIKE '%$searchquestion%' THEN 1 ELSE 0 END AS genres_match,
    CASE WHEN `trackname` LIKE '%$searchquestion%' THEN 1 ELSE 0 END AS trackname_match,
    CASE WHEN `album_name` LIKE '%$searchquestion%' THEN 1 ELSE 0 END AS album_name_match,
FROM p2pm_tracks
WHERE
 `artist` LIKE '%$searchquestion%' OR
 `genres` LIKE '%$searchquestion%' OR
 `trackname` LIKE '%$searchquestion%' OR
 `album_name` LIKE '%$searchquestion%'
ORDER BY 
 `artist_match` DESC,
 `genres_match` DESC,
 `trackname_match` DESC,
 `album_name_match` DESC,
 `popularity` DESC,
LIMIT $startingpoint, $resultsperpage

该查询将收集与以下内容有关的结果:

  • 艺术家第一,
  • 然后这个体裁,
  • 然后曲目的标题,
  • 然后,专辑的名字,
  • 然后这首歌的流行

要优化此查询,应避免使用“ LIKE”,而应使用“ FULLTEXT SEARCH”。

优化的代码将是:

SELECT *,
    CASE WHEN MATCH (artist) AGAINST ('$searchquestion') THEN 1 ELSE 0 END AS artist_match,
    CASE WHEN MATCH (genres) AGAINST ('$searchquestion') THEN 1 ELSE 0 END AS genres_match,
    CASE WHEN MATCH (trackname) AGAINST ('$searchquestion') THEN 1 ELSE 0 END AS trackname_match,
    CASE WHEN MATCH (album_name) AGAINST ('$searchquestion') THEN 1 ELSE 0 END AS album_name_match,
FROM p2pm_tracks
WHERE
 MATCH (artist) AGAINST ('$searchquestion') OR
 MATCH (genres) AGAINST ('$searchquestion') OR
 MATCH (trackname) AGAINST ('$searchquestion') OR
 MATCH (album_name) AGAINST ('$searchquestion')
ORDER BY 
 `artist_match` DESC,
 `genres_match` DESC,
 `trackname_match` DESC,
 `album_name_match` DESC,
 `popularity` DESC,
LIMIT $startingpoint, $resultsperpage

并确保对MySQL表使用MyISAM引擎,并为要搜索的列创建索引。MySQL表的代码应如下所示:

CREATE TABLE p2pm_tracks (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    artist VARCHAR(255) NOT NULL,
    trackname VARCHAR(255) NOT NULL,
    ...
    ...
    FULLTEXT (artist,trackname)
) ENGINE=MyISAM;

有关更多信息,请检查以下内容:-http : //dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html-http : //dev.mysql.com/doc/refman/5.5 /en/fulltext-boolean.html

如果您正在寻找更高级的东西,请研究Solr(基于Lucene),Sphinx,ElasticSearch(基于Lucene)等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何对SQL中多个字段的搜索进行排序和过滤

来自分类Dev

如何过滤多个字段的搜索查询?

来自分类Dev

如何使用QuerySets和MySql“全文搜索”在多个字段中进行Django搜索?

来自分类Dev

如何从多个字段中搜索?

来自分类Dev

如何在Spring Data Web中使用多个字段desc和asc进行排序?

来自分类Dev

如何在Spring Data Web中使用多个字段desc和asc进行排序?

来自分类Dev

在ElasticSearch中的多个字段上进行单词和短语搜索

来自分类Dev

如何在弹性搜索中进行多个字段匹配

来自分类Dev

如何在弹性搜索中进行多个字段匹配

来自分类Dev

如何使用搜索在Swift中搜索多个字段?

来自分类Dev

如何在URI搜索中搜索多个字段

来自分类Dev

在C#中,如何按对象的多个字段对对象集合进行排序?

来自分类Dev

如何使用比较器对集合中的多个字段进行排序?

来自分类Dev

如何根据javascript中的多个字段对数组进行排序

来自分类Dev

MySQL搜索多个字段并对结果排序

来自分类Dev

如何总结SQL中的多个字段

来自分类Dev

如何使用ElasticSearch和CURL请求在多个字段中搜索?

来自分类Dev

从多个字段搜索查询MySQL中的SQL LIKE子句

来自分类Dev

按多个字段对列表进行排序

来自分类Dev

如何按网格中动态创建的字段进行过滤和排序?

来自分类Dev

在弹性搜索中的多个字段中使用多个参数进行搜索

来自分类Dev

如何快速过滤UITableView中的多个字段

来自分类Dev

如何根据条件在多个字段中执行搜索

来自分类Dev

如何在Django模型中搜索多个字段

来自分类Dev

如何在Elasticsearch中搜索数组的多个字段

来自分类Dev

如何在多个字段/列中搜索数据?

来自分类Dev

如何使用 MongoDB 中的 2 个字段的总和进行排序

来自分类Dev

如何在Java中按多个字段排序对象?

来自分类Dev

如何使用Perl在mongodb中按多个字段排序?

Related 相关文章

  1. 1

    如何对SQL中多个字段的搜索进行排序和过滤

  2. 2

    如何过滤多个字段的搜索查询?

  3. 3

    如何使用QuerySets和MySql“全文搜索”在多个字段中进行Django搜索?

  4. 4

    如何从多个字段中搜索?

  5. 5

    如何在Spring Data Web中使用多个字段desc和asc进行排序?

  6. 6

    如何在Spring Data Web中使用多个字段desc和asc进行排序?

  7. 7

    在ElasticSearch中的多个字段上进行单词和短语搜索

  8. 8

    如何在弹性搜索中进行多个字段匹配

  9. 9

    如何在弹性搜索中进行多个字段匹配

  10. 10

    如何使用搜索在Swift中搜索多个字段?

  11. 11

    如何在URI搜索中搜索多个字段

  12. 12

    在C#中,如何按对象的多个字段对对象集合进行排序?

  13. 13

    如何使用比较器对集合中的多个字段进行排序?

  14. 14

    如何根据javascript中的多个字段对数组进行排序

  15. 15

    MySQL搜索多个字段并对结果排序

  16. 16

    如何总结SQL中的多个字段

  17. 17

    如何使用ElasticSearch和CURL请求在多个字段中搜索?

  18. 18

    从多个字段搜索查询MySQL中的SQL LIKE子句

  19. 19

    按多个字段对列表进行排序

  20. 20

    如何按网格中动态创建的字段进行过滤和排序?

  21. 21

    在弹性搜索中的多个字段中使用多个参数进行搜索

  22. 22

    如何快速过滤UITableView中的多个字段

  23. 23

    如何根据条件在多个字段中执行搜索

  24. 24

    如何在Django模型中搜索多个字段

  25. 25

    如何在Elasticsearch中搜索数组的多个字段

  26. 26

    如何在多个字段/列中搜索数据?

  27. 27

    如何使用 MongoDB 中的 2 个字段的总和进行排序

  28. 28

    如何在Java中按多个字段排序对象?

  29. 29

    如何使用Perl在mongodb中按多个字段排序?

热门标签

归档