ruby-on-rails - Sunspot Solr Search like Rails active record 'LIKE' search

标签 ruby-on-rails ruby solr sunspot sunspot-solr

嗨,我一直在我的应用程序中使用正常的 Rails 事件记录 LIKE 搜索,我开始使用 sunspot solr 搜索。我希望它尽可能靠近 rails LIKE 搜索。

wine.rb

#sunspot stuff
  searchable :auto_index => true, :auto_remove => true do
  text :name
end
#sunspot stuff

solr/conf/schema.xml
<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

application_controller.rb
search_string = "will input some values here"
query = "%" + search_string + "%"

solr_search = Wine.search do
  fulltext search_string
end
@solr_search_results = solr_search.results.sort_by{|e| e[:id]}

@rails_search_results = Wine.find(:all, :conditions => ['wines.name LIKE ?' , query]).sort_by{|e| e[:id]}

搜索1

search_string = "盛大"

@solr_search_results
186 大保护区
688 Grand Plaisir 赤霞珠设拉子马尔贝克小维多品丽珠
760 大白葡萄酒
768大胭脂
857 级特级园
第1067章 大经典
第 1584 章
3389 大康斯坦斯马斯喀特
3708 Grand Cuvèe Brut
3857 大康斯坦斯马斯喀特

@rails_search_results
186 大保护区
688 Grand Plaisir 赤霞珠设拉子马尔贝克小维多品丽珠
760 大白葡萄酒
768大胭脂
857 级特级园
969 River Grandeur Cape Blend
972 River Grandeur 赤霞珠
973 River Grandeur霞多丽
974 River Grandeur 白诗南
975 River Grandeur Pinotage
976 River Grandeur Sauvignon Blanc
977 River Grandeur Shiraz
978大河玫瑰
第1067章 大经典
第 1584 章
3389 大康斯坦斯马斯喀特
3708 Grand Cuvèe Brut
3857 大康斯坦斯马斯喀特

似乎 Solr 没有找到包含“Grandeur”的条目,它只找到了完全匹配的条目?我怎样才能解决这个问题?

搜索2

search_string = "rood"

@solr_search_results
200 Dassies Rood Cinsaut 赤霞珠 ruby 赤霞珠
3198 Dassies Rood Cinsaut 赤霞珠 ruby 赤霞珠
3394 罗德

@rails_search_results
200 Dassies Rood Cinsaut 赤霞珠 ruby 赤霞珠
483 Roodeberg Red Cabernet Sauvignon Shiraz Merlot
484 Roodeberg White Sauvignon Blanc Chardonnay Chenin Viognier
第1113章
第 3044 章
3198 Dassies Rood Cinsaut 赤霞珠 ruby 赤霞珠
3394 罗德
3477鲁德堡红
3478 鲁德伯格白
3594 鲁德伯格白
3604鲁德堡红

同样的事情发生在这里,当 search_string = 'rood' 时,solr 没有找到 'Roodeberg',它只找到了完全匹配

更新

向 schema.xml 添加了 nGram 过滤器以进行部分匹配,感谢 DanS
但仍然没有显示所有结果

app/solr/conf/schema.xml
<fieldType name="text" class="solr.TextField" omitNorms="false">

    <analyzer type="index">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15"/>
    </analyzer>

    <analyzer type="query">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    </analyzer>

</fieldType>

它仍然没有完成我想要它做的事情,看看下面的例子

搜索3

search_string = "merl"

@solr_search_results
130 梅洛
202 梅洛
306 梅洛
336 梅洛
556 梅洛
579 梅洛
592 梅洛
623 梅洛
640 梅洛
689 梅洛
694 梅洛
714 梅洛
776 梅洛
790 梅洛
841 梅洛
865 梅洛
891 梅洛
947 梅洛
1015 梅洛
1045 梅洛
1046 梅洛
1073 梅洛
1075 梅洛
1089 梅洛
1096 梅洛
1111 梅洛
1121 梅洛
1144 梅洛
1145 梅洛
1169 梅洛

@rails_search_results
34 Cavalier Reserve Blend Merlot Cabernet Franc Cabernet Sauvignon Shiraz
129 哑黑赤霞珠设拉子梅洛小维多慕合怀特比诺塔吉
130 梅洛
202 梅洛
240 Grappa 赤霞珠梅洛优质
306 梅洛
336 梅洛
416 干桃红梅洛
477 Orchestra Cabernet Sauvignon Malbec Merlot Cab Franc Sh​​iraz
483 Roodeberg Red Cabernet Sauvignon Shiraz Merlot
556 梅洛
579 梅洛
592 梅洛
614 赤霞珠梅洛
623 梅洛
640 梅洛
656 书法梅洛赤霞珠长相思
672 奥丁梅洛
689 梅洛
694 梅洛
696 cask 精选梅洛
714 梅洛
762 私有(private)收藏梅洛
776 梅洛
790 梅洛
795 私有(private)收藏梅洛
816 JJ手工葡萄酒梅洛
832 金三角梅洛
841 梅洛
842 桃红梅洛
854 鹰冠赤霞珠梅洛
865 梅洛
877 Winemakers 精选梅洛设拉子
891 梅洛
892 梅洛储备
893 山红西拉梅洛
941 酒窖精选梅洛赤霞珠
943 葡萄园精选赤霞珠梅洛赤霞珠设拉子
947 梅洛
982 Boet Erasmus Cabernet Sauvignon Merlot Malbec Petit Verdot
983 卡拉赤霞珠设拉子梅洛
984 经典赤霞珠设拉子梅洛
1010 桂冠赤霞珠梅洛
1015 梅洛
1045 梅洛
1046 梅洛
1073 梅洛
1075 梅洛
1079 赤霞珠/梅洛
1089 梅洛
1093 阿德尔伯格赤霞珠梅洛
1096 梅洛
1104 Z 系列品丽珠梅洛赤霞珠
1111 梅洛
1121 梅洛
1144 梅洛
1145 梅洛
1169 梅洛
1186 梅洛
1254 赤霞珠梅洛
1260 赤霞珠/梅洛
1261 梅洛
1269 梅洛
1326 梅洛
1349 赤霞珠梅洛
1364 选种梅洛
1381 梅洛
1384 赤霞珠梅洛
1393 赤霞珠梅洛
1401 赤霞珠梅洛
1404 梅洛
1421 小赤霞珠梅洛
1424 梅洛
1431 珍藏梅洛
1443 梅洛
1454 梅洛
1467 扑克山设拉子梅洛
1468 梅洛
1476 梅洛
1491 环境梅洛
1495 孔雀岭梅洛
1542 梅洛
1543 梅洛
1549 梅洛
1552 梅洛储备
1582 未经过滤的梅洛
1592 梅洛
3001 梅洛
3007 赤霞珠梅洛
3036 赤霞珠梅洛
3056 梅洛
3067 犹太美乐
3073 有机梅洛
3079 优质梅洛
3091 梅洛
3106 梅洛加少许马尔贝克
3133 赤霞珠梅洛
3143 五种气候梅洛
3154 储备一号梅洛
3182 拉努伊赤霞珠梅洛
3183 Reserve Collection Cab Sauv Merlot Cab Franc
3200 梅洛
3236 Giorgio Cabernet Sauvignon Merlot Petit Verdot Shiraz
3258 丹妮德湿赤霞珠梅洛
3276 Red Cabernet Sauvignon Merlot Cab Franc Petit Verdot Shiraz
3288 梅洛
3303 四重奏 Pinotage Cabernet Sauvignon Merlot Shiraz
3307 多样性梅洛马尔贝克
3311 葡萄园创作梅洛
3318 Caapmans 赤霞珠梅洛
3321 Luipaardsberg 梅洛
3322 梅洛
3326 犀牛梅洛
3334 梅洛
3343 梅洛
3363 梅洛赤霞珠
3372 梅洛
3390 梅洛
3416 R 62 梅洛赤霞珠
3418 Unplugged 62 Merlot Rosé
3419 不插电 62 梅洛设拉子
3431 梅洛
3439 KC 赤霞珠梅洛
3471 管弦乐队赤霞珠马尔贝克梅洛赤霞珠设拉子
3497 梅洛
3498 梅洛赤霞珠
3510 梅洛
3531 梅洛
3540 梅洛
3560 梅洛
3568 梅洛玫瑰
3578 特别版梅洛
3581 梅洛
3584 赤霞珠梅洛
3624 梅洛
3642 梅洛酒窖精选
3657 梅洛
3677 梅洛
3681 梅洛
3685 系列 C 赤霞珠梅洛赤霞珠
3693 梅洛
3728 亚历山大方丹梅洛
3755 孔雀岭梅洛
3771 老博物馆梅洛
3773 酒窖精选赤霞珠梅洛
3820 梅洛
3859 梅洛
3882 邓斯通梅洛
3900 达克特梅洛赤霞珠
3919 梅洛
3947 梅洛

最佳答案

好像你想match substrings .

将以下过滤器添加到您的 schema.xml 以匹配索引文本的任何前缀:

<filter class="solr.EdgeNGramFilterFactory"/>

或以下匹配任意子字符串:
<filter class="solr.NGramFilterFactory"/>

有关更多信息,请参阅 Solr wiki .

关于ruby-on-rails - Sunspot Solr Search like Rails active record 'LIKE' search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10601867/

相关文章:

ruby-on-rails - 如何在 json 渲染中获取完整的 belongs_to 对象?

javascript - Firefox 中的混合内容阻止行为

ruby-on-rails - Rails 4 - 使用 Moz API 在 View 中显示信息

ruby - 如何通过 ruby​​ 导出 json 文件?

ruby-on-rails - 如何检索关系/集合的特定属性?

solr - Solr NativeFSLock超时

solr - 对每次搜索使用不同的 Solr 相似度算法

ruby-on-rails - 如何在我的 Nitrous.io 盒子上设置 ElasticSearch 和 Searchkick?

ruby-on-rails - 子类化模型时的数据库和关系设计

java - 更新java时可以自动更新JRE_HOME吗?