2

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

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

例如,当我搜索“石灰”时,我得到以下返回的项目:

  • Diet Sierra Mist 柠檬酸橙冰箱伴侣苏打水
  • G2 柠檬青柠低热量电解质饮料
  • Deer Park Berry Lime 苏打水
  • 海洋喷雾鸡尾酒配酸橙蔓越莓汁
  • 复古苏打水石灰
  • 可乐饮食与石灰苏打轮廓瓶
  • 可乐饮食与石灰苏打冰箱包
  • Diet Sierra Mist 柠檬酸橙冰箱伴侣苏打水
  • Refreshe Soda Diet 柠檬酸橙冰箱包
  • 刷新苏打柠檬酸橙
  • Refreshe 苏打水柠檬酸橙冰箱包
  • Sierra Mist 天然柠檬酸橙苏打水
  • ... ETC

我真正想要的是真正的水果,它们在我的数据库中列为以下产品:

  • 大石灰
  • 有机酸橙
  • 预先包装好的石灰钥匙

如何让我的搜索更智能?

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

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

水果和蔬菜 > 新鲜水果 > 柑橘 > 大柠檬

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

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

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

4

2 回答 2

3

我是 Picky 的开发者——所以我有点偏见;)

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

鉴于我的产品名称中包含“石灰”一词,并且其中一些产品未归类为水果,其中一些产品未归类为水果,但作为饮料,您希望用户能够过滤查询,以便仅搜索水果。

我希望我理解正确。

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

但是,由于您想根据某物是否属于某个类别进行过滤,我认为分面搜索最适合此类任务。Picky 最近添加了多面搜索。所以你会做这样的事情:

picky_search.search "lime"

显示石灰的结果,但也使用边显示“石灰”的所有可能类型

picky_search.facets :type, filter: "lime"

你会得到一个可能类型的散列,像这样:{ :fruit => 3, :beverage => 150 }. 然后,如果用户单击“fruit”,您将向 Picky 发送另一个查询,这次使用前置过滤器:

picky_search.search "type:fruit lime"或者picky_search.search "type:fruit name:lime"如果已经很清楚该人正在以“石灰”的名义搜索。

这只会返回水果类型的石灰。

这只是一个简单的概述,希望对您有所帮助!

于 2012-08-08T13:53:51.293 回答
1

至于“类别”,您可能还想考虑使用标记系统。那里有许多标记宝石。这样,正在搜索的内容与您创建的任何其他数据结构或“树”无关。

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

一个好的起点将是波纹管。

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

这样你就可以得到像 Diet Sierra Mist Lemon Lime Fridge Mate Soda 这样的东西,没有用 Lemon 标记,所以它不会出现,但你仍然可以标记像 Sunny D 这样的东西,标记为“Orange Juice”。同时通过使用默认标签不会对您的后端用户造成困难!

至于实际搜索,使用谷歌搜索系统可能是值得的,同时不支付广告费用。您可以使用标签作为关键字来缩小结果范围。我相信这对搜索引擎优化也有帮助,同时将搜索交给谷歌,这意味着支持基本上是有保证的。

于 2012-07-30T19:12:50.663 回答