用于食品的Rails搜索(全文与语义)

时间:2012-07-30 18:38:04

标签: ruby-on-rails search full-text-search thinking-sphinx semantic-analysis

我正在尝试为Rails中的杂货店构建搜索界面。 我在我的数据库中存储了几种杂货店产品,但我很难找到一种搜索它们的好方法。

到目前为止,我已使用Thinking Sphinx对产品进行全文搜索。 这适用于某些项目,例如“鸡蛋”,但对于其他搜索有一些问题,例如'lime'。

例如,当我搜索“lime”时,我会收到以下返回的项目:

  • 饮食Sierra Mist柠檬石灰冰箱伴侣苏打
  • G2柠檬酸低卡路里电解质饮料
  • Deer Park Berry Lime苏打水
  • 海洋喷雾鸡尾酒配酸橙蔓越莓汁
  • Vintage Seltzer Water Limn Lime
  • 可乐饮食与石灰苏打轮廓瓶
  • 可乐饮食与石灰苏打冰箱包
  • 饮食Sierra Mist柠檬石灰冰箱伴侣苏打
  • Refreshe苏打饮食柠檬青柠冰箱包
  • Refreshe Soda Lemon Lime
  • Refreshe苏打柠檬青柠冰箱包
  • Sierra Mist天然柠檬酸碱苏打
  • ...... etc

我真正想要的只是实际水果,在我的数据库中列为这些产品:

  • Limes Large
  • 有机酸橙
  • Limes Key Prepacked

如何让我的搜索变得更聪明?

值得注意的是,我确实对每种产品都有很多分类数据。 我基本上有一个完整的“食物树”,每个产品都是树的根节点。

例如,对于产品'Limes Large',我有以下类别:

水果&蔬菜>新鲜水果>柑橘>酸橙大

如何更好地使用这些类别来改善搜索?

在我的研究中,我开始相信我需要使用语义搜索而不是全文搜索。 我遇到了Picky gem的Ruby,看起来很有希望,但我不确定我是否有正确的方法。

语义搜索可以帮助我进行更好的搜索吗? Picky是否适合以这种方式分类的数据?还有其他见解吗? 任何指导都会非常感激。提前谢谢。

2 个答案:

答案 0 :(得分:3)

我是Picky的开发者 - 所以我有点偏颇;)

如果我理解正确,你的问题似乎是:

  

鉴于我的产品名称中包含“lime”字样,   鉴于其中一些产品未被归类为水果,   其中一些产品不属于水果,而是分类为   饮料,你希望用户能够过滤查询以便   只搜寻水果。

我希望我理解正确。

Picky的主要模式是分类搜索。也就是说,如果有人在查询中输入“lime fruit”,Picky会找到类似(名称:lime,type:fruit)和所有其他组合的内容,例如。 (公司:石灰,类型:饮料)。或者用户可以通过一个漂亮的界面预定义,他搜索水果:“类型:水果石灰”,这将告诉Picky只查找“水果”类型的结果,并在任何类别中查找“石灰”。

但是,由于您希望根据某个类别中的某些内容进行过滤,我认为分面搜索最适合此类任务。 Picky最近加入了分面搜索。所以你会做类似的事情:

picky_search.search "lime"

显示石灰的结果,但也使用

显示侧面“石灰”的所有可能类型

picky_search.facets :type, filter: "lime"

您将获得可能类型的哈希值,如:{ :fruit => 3, :beverage => 150 }。 然后,如果用户点击“水果”,你会发送Picky另一个查询,这次使用前置过滤器:

picky_search.search "type:fruit lime"picky_search.search "type:fruit name:lime"如果已经清楚该人正在搜索“lime”的名称。

这只会回归水果的味道。

这只是一个快速概述,我希望它有所帮助!

答案 1 :(得分:1)

至于“类别”,您可能还想考虑使用标记系统。那里有许多标记宝石。这样,被搜索的内容就会被你创建的任何其他数据结构或“树”所束缚。

为了方便起见,您可以使用它,以便在创建时自动放置在项目上的标记基于其在树中的位置和/或项目名称。这使得它可以在需要时轻松更改,但同时具有树系统的易用性,同时仍然具有标签系统的狭窄搜索功能。

一个好的起点就在下面。

https://github.com/mbleigh/acts-as-taggable-on#readme

这样你可以吃一些像Diet Sierra Mist Lemon Lime Fridge Mate Soda没有用柠檬标记的东西,所以它不会出现,但你仍然可以标记类似Sunny D标记为“Orange Juice”的东西。通过使用默认标签,所有这些都不会让你的后端用户变得困难!

至于实际搜索,使用谷歌搜索系统进行调查可能是值得的,同时支付无广告费用。您可以使用标记作为关键字来缩小结果范围。我相信这也有助于搜索引擎优化,同时将搜索放在谷歌的手中,这意味着支持基本上得到保证。