ruby-on-rails - Rails 食品搜索(全文与语义)

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

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

到目前为止,我已经使用了Thinking Sphinx对产品进行全文搜索。 这对于某些项目(例如“鸡蛋”)效果很好,但对于其他搜索(例如“石灰”)却存在一些问题。

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

  • Diet Sierra Mist 柠檬青柠冰箱伴侣汽水
  • G2 柠檬酸橙低热量电解质饮料
  • 鹿园浆果酸橙气泡水
  • 海洋喷雾鸡尾酒配酸橙蔓越莓汁
  • 复古苏打水水 Limn Lime
  • 可乐减肥与石灰汽水轮廓瓶
  • 可乐减肥加柠檬汽水冰箱包装
  • Diet Sierra Mist 柠檬青柠冰箱伴侣汽水
  • 清爽苏打减肥柠檬酸橙冰箱包
  • 清爽苏打柠檬酸橙
  • 清爽苏打柠檬柠檬冰箱包
  • Sierra Mist 天然柠檬酸橙苏打水
  • ...等

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

  • 青柠大
  • 有机酸橙
  • 预装 Limes key

如何使我的搜索更加智能?

值得注意的是,我确实有每个产品的大量分类数据。 我本质上有一棵完整的“食物树”,其中每个产品都是树的根节点。

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

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

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

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

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

最佳答案

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

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

Given that I have products that contain the word "lime" in its name, and given that some of those products are not categorized as fruit, and some of those products are not categorized as fruit, but as beverages, you'd like the user to be able to filter the query so to only search for fruit.

希望我理解正确。

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

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

picky_search.search“石灰”

显示石灰的结果,而且还使用侧面显示“石灰”的所有可能类型

picky_search.facets:类型,过滤器:“lime”

您将获得可能类型的哈希值,如下所示:{ :fruit => 3, :beverage => 150 }。 然后,如果用户单击“fruit”,您将向 Picky 发送另一个查询,这次带有前置过滤器:

picky_search.search "type:fruit Lime"picky_search.search "type:fruit name:lime"(如果已明确该人正在搜索该名称) “石灰”。

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

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

关于ruby-on-rails - Rails 食品搜索(全文与语义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11727537/

相关文章:

ruby-on-rails - Rails 3 按 belongs_to 搜索

mysql - 将 SQL "Concat"转换为 Activerecord

javascript - elasticlunr.js 不显示搜索查询结果

c# - 在通用列表中搜索项目时,我应该使用 LINQ 还是 Contains?

go - XML 文件的部分索引 (Bleve)

ruby-on-rails - Phusion Passanger、Apache 2、mysql 和 Linux

jquery - 一起使用 Cocoon(嵌套表单)和 jQuery 可排序

java - 二进制搜索在 Java 中给出 Index Out of Bound 异常

mongodb - Mongoose 中权重的全文搜索

mongodb全文搜索多个短语