Php Sphinx搜索的数据库定义 背景

Php Sphinx搜索的数据库定义 背景,php,mysql,sql,search,sphinx,Php,Mysql,Sql,Search,Sphinx,我正在创建一个MySQL数据库来存储课程等项目,其中单个课程可能有许多属性。例如: 单个课程可能具有以下任何或所有属性: 标题(varchar) 次要标题(varchar) 说明(文本) 日期 时间 具体位置(varchar;如白厅7号房间) 一般位置(瓦尔查尔;如内华达州拉斯维加斯) 位置坐标(浮动;如横向、纵向) 等等 数据库设置如下: 存储特定课程信息的表: 课程表: 课程ID(每个课程的主键唯一ID) 创建者ID(创建者的唯一ID) 创建日期(课程创建的日期时间) 修改日期(其中这

我正在创建一个MySQL数据库来存储课程等项目,其中单个课程可能有许多属性。例如:

单个课程可能具有以下任何或所有属性:

  • 标题(varchar)
  • 次要标题(varchar)
  • 说明(文本)
  • 日期
  • 时间
  • 具体位置(varchar;如白厅7号房间)
  • 一般位置(瓦尔查尔;如内华达州拉斯维加斯)
  • 位置坐标(浮动;如横向、纵向)
  • 等等
数据库设置如下:

存储特定课程信息的表:

课程表:

  • 课程ID(每个课程的主键唯一ID)
  • 创建者ID(创建者的唯一ID)
  • 创建日期(课程创建的日期时间)
  • 修改日期(其中这是课程修改的最新时间戳)
存储每个课程多个属性的表设置如下:

课程属性表:

  • 属性\u ID(每个属性的唯一ID)
  • 课程ID(对特定课程属性的引用用于)
  • 属性(定义属性的varchar;例如“title”)
  • 值(包含指定属性值的文本;例如“我的课程标题”)
渴望 我想用sphinx搜索来搜索这个数据库。通过这个搜索,我有不同的字段,权重不同,例如:“title”比“description”更重要

我希望具有的特定搜索字段包括:

  • 头衔
  • 日期
  • 位置(字符串)
  • 位置(地理位置-纬度/长)
问题 我应该在Mysql中定义一个视图来根据“title”、“description”等组织属性,还是有办法定义我的sphinx.conf文件来理解特定属性

我愿意接受解决这个问题的所有建议,无论是数据库/表的重新排列还是我搜索的方式

如果您需要任何其他详细信息来帮助我找到解决方案,请告诉我

提前感谢您的帮助

!--更新--! 好的,在阅读了一些答案之后,我觉得我应该提供一些额外的信息

纬度/经度

纬度/经度属性由我在收到常规位置字符串后在内部创建。我可以按照我希望的任何方式生成值,这意味着我可以将它们存储在一个lat/long属性中,作为“float lat,float long”值或任何其他所需格式。只有在从初始位置字符串生成并验证它们之后,才能执行此操作。这是为了防止@X-Zero和@Cody建议的格式错误的数据

请记住,纬度和经度只是说明了需要搜索该字段,而不是其他任何字段。这只是另一个属性;其中之一

加权搜索结果

我知道如何在Sphinx搜索查询中为结果添加权重:

$cl->setFieldWeights( array('title'=>1000, 'description'=>500) );
这会导致
标题
列的权重高于
说明
列(如果结构为@X-Zero建议的)。我的问题更直接地指向如何将上述逻辑应用于当前的表定义

数据库结构、视图和效率

利用我对
视图的入门知识
,我想我可以创建一些东西,为每个课程显示一行,其中每个属性都是自己的列。我不知道如何做到这一点,或者这是否可能

我对数据库结构不是最有信心的,但我之所以按上述方式设置表,是因为在很多情况下,并非每门课程都能完成所有字段,而且我一直在努力提高效率[是的,似乎我失败了]


我认为使用我当前的结构,每个属性都将包含一个值,因此不会在表中浪费空间。或者,如果我有一个具有大量潜在属性的表,我会认为这会浪费空间。如果我错了,我很高兴知道为什么我的理解是错误的。

让我先说一句,我从来没有听说过斯芬克斯,也没有(显然)使用过它。然而,从数据库的角度来看

像这样做多域专栏是一个非常糟糕的想法(我会找到你并杀了你)。首先,不可能有意义地索引或排序,周期。你还必须祈祷你不会得到一个带有文本数据的
latitude
属性(因为这只能通过编程来强化,所以我要告诉你这会发生)-这样做会导致所有基于距离的公式崩溃。说到位置,如果某人存储的是
纬度
,而没有
经度
(请注意,这是可能的,无论您存储的是单个
地理位置
属性还是一对)

您的最佳选择是执行以下操作:

  • 找出始终需要的
    属性。这些属于
    课程
    表(…大部分)
  • 对于每个相关的可选属性集,创建一个表。例如,
    location
    (虽然这可能是必需的…),它将包含纬度/经度、城市、州、地址、房间等。允许列为
    null
    (在集合中-添加约束,以便用户不能只添加
    经度
    ,而不添加
    纬度
  • 对于每一组常见查询,添加一个视图。即使(特别是)如果您坚持使用当前的设计,也要使用视图。这促进了l之间的分离