2

我正在嘗試爲Rails中的一家雜貨店構建一個搜索界面。 我有幾個雜貨店產品存儲在我的數據庫中,但我正在努力尋找一種很好的方式來搜索他們。Rails在食品中搜索(全文與語義)

到目前爲止,我用Thinking Sphinx來做產品的全文搜索。 這適用於某些項目,比如「雞蛋」,但對其他搜索有一些問題,例如「石灰」。

例如,當我搜索「石灰」,我得到以下歸還物品:

  • 飲食塞拉利昂霧酸檸檬冰箱伴侶蘇打
  • G2酸檸檬低熱量電解質飲料
  • 鹿公園貝瑞石灰蘇打水
  • 海洋噴霧雞尾酒石灰蔓越莓汁
  • 復古塞爾策水淡水湖石灰
  • 可樂飲食酸橙汽水等高瓶
  • 可樂飲食酸橙汽水冰箱包
  • 飲食塞拉利昂霧酸檸檬冰箱伴侶蘇打
  • Refreshe蘇打節食檸檬石灰冰箱包
  • Refreshe蘇打檸檬青檸
  • Refreshe檸檬蘇打石灰冰箱包
  • 塞拉利昂霧天然檸檬酸橙蘇打水
  • ...等

我真正想要的是實際的水果,這被列爲這些產品在我的數據庫:

  • 利姆大
  • 有機石灰
  • 石灰重點預裝

我怎樣才能使我的搜索更智能?

值得注意的是,我對每種產品都有很多分類數據。 我基本上有一個完整的「食物樹」,其中每個產品都是樹的根節點。

對於產品「酸橙大的」,例如,我有以下幾類:

水果&蔬菜>新鮮水果>柑橘類>檸檬大

我怎樣才能更好地利用這些類別來改善我的搜索?

在我的研究中,我開始相信我需要使用語義搜索而不是全文搜索。 我遇到了Ruby的Picky gem,看起來很有前途,但我不確定我是否有正確的方法。

語義搜索可以幫助我執行更好的搜索嗎? Picky是否適合以這種方式分類的數據?任何其他見解? 任何指導將非常感激。提前致謝。

回答

1

至於'類別',你可能想要考慮使用標籤系統。那裏有一些標記寶石。這樣,搜索的內容就會從您創建的任何其他數據結構或「樹」中移除。

爲了簡化您的工作,可以在創建時自動放置在物品上的標籤基於其在樹中的位置和物品名稱。這使得如果需要出現,它可以很容易地被改變,但是同時又具有樹系統的易用性,同時仍然具有標籤系統的窄搜索能力。

一個很好的開始會在下面。

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

這樣,你可以有類似的飲食塞拉利昂霧酸檸檬冰箱伴侶純鹼未添加檸檬所以它不會來了,但你仍然可以標記像陽光d標記爲「橙汁「。所有這一切都沒有通過擁有默認標籤來強化後端用戶!

至於真正的搜索,它可能只是值得它看看使用谷歌搜索系統,同時支付沒有廣告。您可以使用標籤作爲關鍵字來縮小結果範圍。我相信這也有助於搜索引擎優化,同時把搜索放在谷歌的手中,這意味着支持基本得到保證。

3

我挑剔的開發商 - 讓我有點偏頗;)

你的問題似乎是,如果我理解正確:

考慮到我有包含單詞產品「石灰「,其名稱爲 ,並且鑑於其中一些產品未歸類爲水果, ,其中一些產品未歸類爲水果,但是作爲 飲料,您希望用戶能夠過濾查詢所以到 只搜索水果。

我希望我理解正確。

Picky的主要模式是分類搜索。也就是說,如果有人在查詢中輸入「lime lime」,Picky會發現類似(名稱:lime,類型:水果)以及所有其他組合,例如。 (公司:石灰,類型:飲料)。或者用戶可能已經通過一個漂亮的界面預先定義了他搜索水果:「類型:水果石灰」,這會告訴Picky只在類型「水果」中尋找結果,在任何類別中尋找結果。

但是,由於您想根據是否屬於某個類別進行過濾,因此我認爲分面搜索最適合這類任務。 Picky最近得到了分面搜索。所以,你會做這樣的事情:

picky_search.search "lime"

顯示石灰的結果,但也顯示使用所有可能的類型就在身邊「石灰」

picky_search.facets :type, filter: "lime"

你得到可能類型的哈希值,如下所示:{ :fruit => 3, :beverage => 150 }。 然後,如果用戶的「果」點擊,你會送挑剔的另一個查詢,這次預謀過濾器:

picky_search.search "type:fruit lime"picky_search.search "type:fruit name:lime"如果它已經明確表示,人的名稱爲「石灰」搜索。

這隻會返回類型的水果石灰。

這只是一個快速概覽,我希望它有幫助!

+0

謝謝!這真的很有幫助。我最終爲TS增加了一些索引和屬性,以更好地處理類別。但我認爲Picky總體上有更好的方法。我可能會在不久的將來將它移植過來。 – paniwani 2012-08-08 19:28:26

+0

您的方法聽起來也不錯:)如果您有時間,生成示例服務器並使用它稍微花費一點費用。歡呼和樂趣! – 2012-08-09 08:52:06