gpt4 book ai didi

sunspot - 如何在太阳黑子中动态构建搜索 block ?

转载 作者:行者123 更新时间:2023-12-04 14:49:30 26 4
gpt4 key购买 nike

我正在将 Rails 应用程序从使用 act_as_solr 转换为 sunspot。

该应用程序使用在acts_as_solr 中公开的solr 中的字段搜索功能。你可以给它一个这样的查询字符串:

title:"The thing to search"

它会在标题字段中搜索该字符串。

在转换为太阳黑子时,我正在解析查询字符串的字段特定部分,我需要动态生成搜索块。像这样的东西:

Sunspot.search(table_clazz) 做
关键字(first_string,:fields => :title)
关键字(second_string,:字段=> :描述)

...
paginate(:page => page, :per_page => per_page)
结尾

如果查询需要,还需要进行持续时间(秒,整数)范围和否定,这很复杂。

在当前系统上,用户可以搜索标题中的内容,排除其他字段中包含其他内容的记录并按持续时间确定范围。

简而言之,如何动态生成这些块?

最佳答案

我最近用instance_eval做了这种事情在 Sunspot 搜索块的上下文中评估 procs(在别处创建)。

优点是这些过程可以在您的应用程序中的任何位置创建 您可以使用与在太阳黑子搜索块中相同的语法来编写它们 .

这是一个快速示例,可帮助您开始处理特定情况:

def build_sunspot_query(conditions)
condition_procs = conditions.map{|c| build_condition c}

Sunspot.search(table_clazz) do
condition_procs.each{|c| instance_eval &c}

paginate(:page => page, :per_page => per_page)
end
end

def build_condition(condition)
Proc.new do
# write this code as if it was inside the sunspot search block

keywords condition['words'], :fields => condition[:field].to_sym
end
end

conditions = [{words: "tasty pizza", field: "title"},
{words: "cheap", field: "description"}]

build_sunspot_query conditions

顺便说一句,如果需要,您甚至可以在另一个 proc 内对一个 proc 进行 instance_eval(在我的情况下,我组合了任意嵌套的“和”/“或”条件)。

关于sunspot - 如何在太阳黑子中动态构建搜索 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9119127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com