Sphinx搜索的数据库定义

时间:2011-10-20 12:40:24

标签: php mysql sql search sphinx

背景

我正在创建一个 MySQL 数据库来存储诸如课程之类的课程,这些课程可能有很多属性。例如:

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

  • 标题(varchar)
  • 次要标题(varchar)
  • 说明(文字)
  • 日期
  • 时间
  • 特定地点(varchar;例如白厅7室)
  • 一般位置(varchar;例如拉斯维加斯,内华达州)
  • 位置坐标(浮子;例如,拉特,长)

数据库设置如下:

存储特定课程信息的表格:

课程表:

  • Course_ID(每门课程的主键唯一ID)
  • Creator_ID(创作者的唯一ID)
  • Creation_Date(课程创建的日期时间)
  • Modified_Date(这是修改课程的最新时间戳)

存储每个课程多个属性的表格设置如下:

course_attributes表:

  • Attribute_ID(每个属性的唯一ID)
  • Course_ID(对特定课程属性的引用适用于)
  • 属性(varchar定义属性;例如'title')
  • 值(包含指定属性值的文本;例如“我的课程名称”)

欲望

我想使用sphinx搜索来搜索此数据库。通过此搜索,我有不同的字段权衡不同的金额,例如:'title'比'description'更重要。

我希望拥有的特定搜索字段是:

  • 标题
  • 日期
  • 位置(字符串)
  • 位置(地理 - 纬度/长)

问题

我应该在Mysql中定义一个 View 来根据'title','description'等来组织属性,还是有办法定义我的 sphinx。 conf 文件以了解特定属性?

我对解决这个问题的所有建议持开放态度,无论是重新安排数据库/表格还是我搜索的方式。

如果您需要任何其他详细信息以帮助我找到解决方案,请与我们联系。

提前感谢您的帮助

! - 更新! -

好的,所以在阅读了一些答案之后,我觉得我应该提供一些额外的信息。

纬度/经度

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

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

加权搜索结果

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

$cl->setFieldWeights( array('title'=>1000, 'description'=>500) );

如果结构为@ X-Zero建议,则会导致title列的权重高于description列。我的问题更多地是针对如何将上述逻辑应用于当前表定义。

数据库结构,视图和效率

使用我对Views的介绍性知识,我想我可以创建一些东西,为每个课程显示一行,其中每个属性都是自己的列。我不知道如何实现这一点,或者甚至可能。

我对数据库结构不是最有信心,但我按照描述设置表格的原因是因为在很多情况下并不是每个课程都会完成所有字段而我尝试高效[是的,似乎我失败了]。

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

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

在sphinx配置中,您可以定义索引以及填充它的SQL查询。您可以定义基本属性,请参阅Sphinx Attributes

Sphinx还支持lat / long上的地理搜索,但它们需要用弧度表示,绝对不是像你一样的文本列。我同意X-Zero认为存储lat / lng值是字符串是错误的想法。