gpt4 book ai didi

ruby-on-rails - Rails elasticsearch - 命名范围搜索

转载 作者:行者123 更新时间:2023-11-29 02:49:38 25 4
gpt4 key购买 nike

我正从 Tire gem 转移到官方 elasticsearch Ruby wrapper并且正在努力实现更好的搜索功能。

我有一个模型 InventoryItem 和一个模型 Store商店 has_many :inventory_items。我在 Store 上有一个名为 local

的模型范围
scope :local, lambda{|user| near([user.latitude, user.longitude], user.distance_preference, :order => :distance)}

我希望搜索仅返回此范围内的结果,因此我尝试了:InventoryItem.local(user).search.... 但它会搜索整个索引,而不是范围。做了一些研究后,看起来过滤器是实现此目的的好方法,但我不确定如何实现。我也对实现这一目标的其他方式持开放态度。我的最终目标是能够根据商店位置搜索 InventoryItem 模型的子集。

最佳答案

您可以做的另一件事是将有效 ID 列表直接发送给 elastic,这样它会自行过滤掉记录,然后对剩下的记录执行搜索。我们还没有测试它是否更快,但我认为它应该,因为 elastic 毕竟是一个搜索引擎。

我将尝试使用您的类 + 变量和我们的经验来编写一个示例:

def search
# retrieve ids you want to perform search within
@store_ids = Store.local(current_user).select(:id).pluck(:id)
# you could also check whether there are any ids available
# if there is none - no need to request elastic to search
@response = InventoryItem.search_by_store_ids('whatever', @store_ids)
end

还有一个模型:

class InventoryItem
# ...

# search elastic only for passed store ids
def self.search_by_store_ids(query, store_ids, options = {})
# use method below
# also you can use it separately when you don't need any id filtering
self.search_all(query, options.deep_merge({
query: {
filtered: {
filter: {
terms: {
store_id: store_ids
}
}
}
}
}))
end

# search elastic for all inventory items
def self.search_all(query, options = {})
self.__elasticsearch__.search(
{
query: {
filtered: {
query: {
# use your fields you want to search, our's was 'text'
match: { text: query },
},
filter: {},
strategy: 'leap_frog_filter_first' # do the filter first
}
}
}.deep_merge(options)
# merge options from self.search_by_store_ids if calling from there
# so the ids filter will be applied
)
end
# ...
end

这样你还必须索引 store_id

您可以阅读有关过滤器的更多信息 here .

关于ruby-on-rails - Rails elasticsearch - 命名范围搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002833/

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