使用SearchKick实现拼写纠正提示功能
当然可以实现!用SearchKick完全能做出类似谷歌那样的拼写纠正提示效果,下面一步步教你怎么弄:
1. 先在模型里启用拼写纠正功能
首先得确保你的模型已经开启了拼写纠正支持,在searchkick方法里配置misspellings参数就行,还可以自定义编辑距离(控制允许纠正的错误字符数):
class Product < ApplicationRecord # 启用拼写纠正,允许最多2个字符的编辑错误 searchkick misspellings: { edit_distance: 2 } end
2. 在搜索逻辑里获取纠正后的查询词
当你执行搜索时,SearchKick返回的结果对象里会包含corrected_query属性——只有当原搜索词存在拼写错误,且系统找到合适的纠正词时,这个属性才会有值。比如搜索"Penut",它就会返回"Peanut"。
控制器里的示例代码:
def search # 执行搜索时也可以单独指定misspellings: true(如果模型没全局配置的话) @products = Product.search(params[:query], misspellings: true) # 提取纠正后的查询词 @corrected_query = @products.corrected_query end
3. 在视图里显示提示信息
接下来在前端页面里判断,如果@corrected_query存在,就显示类似谷歌的提示:
<% if @corrected_query.present? %> <p>显示针对 <strong><%= @corrected_query %></strong> 的搜索结果(原搜索词:<strong><%= params[:query] %></strong>)</p> <% end %> <!-- 下面是搜索结果列表 --> <% @products.each do |product| %> <div class="product-item"> <h3><%= product.name %></h3> <!-- 其他产品信息 --> </div> <% end %>
额外技巧:自定义拼写纠正规则
如果需要更精细的控制,比如指定允许纠正的词汇字典,或者限制前缀长度(避免纠正完全不相关的词),可以这样配置:
searchkick misspellings: { edit_distance: 1, # 只允许1个字符的错误 prefix: 3, # 前3个字符必须正确才会纠正 dictionary: ["peanut", "almond", "walnut"] # 只在这个字典里找纠正词 }
另外,如果你不想自动返回纠正后的结果,而是想让用户选择是否切换(比如显示"你是不是想找:Peanut?"),可以用suggest参数:
results = Product.search("Penut", suggest: true) results.suggestions # 返回 ["Peanut"]
然后在视图里做一个跳转链接,让用户点击切换到纠正后的搜索即可。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

