我在Algolia的索引包含大约5万条记录.使用javascript api检索记录时,它只返回最多1000条记录,我使用的是search()函数.有什么建议?
我目前正在使用社交网络应用程序,我需要进行搜索功能.Firestore不支持这类查询,因此我需要使用像Algolia这样的外部服务.
问题是免费计划不支持连接到谷歌以外的外部网站/ API,因此我无法连接到Algolia以使我的搜索系统正常工作.
我已经阅读了多个关于开发者因代码中的循环或错误而支付高额费用的故事,并且由于Blaze计划是一个按需付费的计划,他们会收取他们使用的费用.如果一个循环生成10TB的文件,他们将收取相应的费用.
我也知道Blaze计划的功能是免费的,只要他们每个人(单独)都低于免费Spark计划的限制.
正如我的问题所说,有没有办法设定限制?例如,我想告诉Firebase将我的云功能调用限制为每月10万次.这样它就是免费的,因为它有限,我永远无法超过100k,这意味着我永远不会为此付费.
考虑到我现在从付费计划中唯一需要的是与外部网络的连接.我不需要任何其他东西因为我们刚刚开始并且应用程序没有投入生产,所以不需要巨大的限制.
我正在显示我从Algolia获得的分页结果.我在我的控制器中有两个查询,我分页.这是我将数据从控制器发送到视图的方式:
public function index(Request $request)
{
if(!$request->q && !$request->page){
return redirect('/');
}
$videos = Video::search($request->q)->paginate(1);
$videosCollection = $videos->getCollection();
return fractal()
->collection($videosCollection)
->parseIncludes(['player'])
->transformWith(new VideoTransformer)
->paginateWith(new IlluminatePaginatorAdapter($videos))
->toArray();
}
Run Code Online (Sandbox Code Playgroud)
那么当我搜索示例时,'rene'结果显示在url上http://videoapp.app/search?q=rene
,我得到的数据如下所示:
{
data: [
{
id: 46,
description: null,
views: 0,
created_at: "1 month ago",
player: {
data: {
id: 34,
image: "15889ca47e557c12240142_1013305815416003_5199651181367705874_n.jpg",
first_name: "Bruno",
last_name: "Hendricks"
}
}
}
],
meta: {
pagination: {
total: 2,
count: 1,
per_page: 1,
current_page: 1,
total_pages: 2,
links: {
next: …Run Code Online (Sandbox Code Playgroud) 我正在一个类似Airbnb的网站上工作,我正在用Algolia重写我们内部的基于SQL的搜索系统.到目前为止,这是一段非常愉快的旅程,因为我已经设法删除了大量遗留代码并将其外包,结果非常棒.但是,我们的搜索系统中有一个关键部分我不确定可以用Algolia实现.
在内部,我们将每个资产的每个日期的可用性/不可用性(和价格)存储为数据库中的单个行.这意味着我们的availabilities表看起来像这样:
asset_id | date | status | price_cents
-------- | ---------- | ----------- | -----------
1 | 2017-02-09 | available | 15000
1 | 2017-02-10 | available | 15000
1 | 2017-02-11 | unavailable | NULL
1 | 2017-02-12 | available | 20000
Run Code Online (Sandbox Code Playgroud)
当用户搜索可用属性时,他们会输入日期范围和(可选)价格范围.
我们现在正在做的只是查询availabilities表并确保日期范围内的所有日期都可用于该资产(即可用日期的计数等于该范围内的天数).如果用户输入价格范围,我们还会确保这些日期的平均价格在要求的范围内.SQL查询相当复杂,但这是它在一天结束时所做的事情.
我一直试图用Algolia复制这个,但找不到任何关于类似功能的文档.事实上,我现在面临两个不同的问题:
有没有办法与Algolia实现这一目标?如果没有,是否可以将SQL或其他工具与Algolia结合使用以达到预期效果?当然,我可以用Elasticsearch完成所有这些工作,但是Algolia如此快速和简单,我不愿意因为这些问题而离开它.
我正在尝试将我的数据库与外部服务同步.
我正在Web应用程序的几个地方使用Algolia搜索.
它是用几个模型编制索引的,但是如果对数据库进行任何更改,即在触发多个模型事件时,我需要它重新编制索引.
我的第一个方法是在AppServiceProvider的boot方法中执行所有操作
public function boot()
{
$events = ['created', 'updated', 'deleted', 'restored'];
// reindex handlers for models relevant to Algolia search
foreach ($events as $evt) {
Order::registerModelEvent($evt, function () {
Order::reindex();
});
Product::registerModelEvent($evt, function () {
Product::reindex();
Product::setSettings();
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是我使用文档中示例的标准模型函数来避免多个条件的方法.
但是我假设使用Laravel事件监听器有更好的方法.
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我不确定如何在listen方法中使用模型事件.
假设我正在建立一个酒店预订平台,每个房间记录都有可用性日历.常见的搜索条件是按持续时间搜索.用户输入开始日期和结束日期的位置,数据库提取未从该持续时间占用的房间.
我已经实现了一种非常天真的方法,我将占用的天数存储为一系列天.
attribute :occupied_at_i do
array = []
if !occupied_at.empty?
occupied_at.each do |date|
array << Time.parse(date).to_i
end
end
array
end
Run Code Online (Sandbox Code Playgroud)
然后在客户端,我添加以下javascript代码来交叉检查当天是否在 numericRefinement
// Date Filters
$('.date-field')
.on('change', function() {
if(_.every(_.map($('.date-field'), function(date) {return _.isEmpty(date.value) }), function(n) {return n==false;})) {
helper.clearRefinements('occupied_at_i');
var arrayOfDates = addDateFilters();
_.forEach(arrayOfDates, function(n) {
helper.addNumericRefinement('occupied_at_i', '!=', n);
});
showClearAllFilters();
helper.search();
}
});
Run Code Online (Sandbox Code Playgroud)
所以,它显然不是一个好方法,我想知道什么是更好的利用algolia和搜索持续时间?
谢谢
我使用algolia javascript api使用浏览功能检索索引中的所有记录,但它仍然返回1000条记录.这是我的代码:
function load_location_list(){
var client = algoliasearch('ID', 'KEY');
var index_name = "locations_new";
var attribute_list = "*";
var index = client.initIndex(index_name);
index.browse({
"attributesToRetrieve": attribute_list,
}).then(function search_Success(response) {
console.log(response);
});
Run Code Online (Sandbox Code Playgroud)
}
我在PHP中使用Algolia搜索服务,我的API调用没有返回所有记录.有解决方案吗 返回的最大记录数为1000,但记录总数远远超过1000.
我使用的是instantsearch.js由Algolia提供的库.
我想要的行为是:如果访问者没有在搜索框中输入任何内容,则不会返回任何结果.
但是,Algolia 文件指出:
如果未设置查询参数,则文本搜索将与所有对象匹配.
是否可以在使用instantsearch.js时更改此行为?
这是我目前的代码:
<script type="text/javascript" src="http://cdn.jsdelivr.net/instantsearch.js/1/instantsearch.min.js"></script>
<script type="text/javascript">
window.onload = function ()
{
function getTemplate(templateName) {
return document.getElementById(templateName + '-template').innerHTML;
}
var search = instantsearch({
appId: '{{config["ALGOLIA_APPLICATION_ID"]}}',
apiKey: '{{config["ALGOLIA_API_KEY"]}}',
indexName: '{{config["ALGOLIA_INDEX_NAME"]}}',
urlSync: true
});
search.addWidget(
instantsearch.widgets.searchBox({
container: '#search-input'
})
);
search.addWidget(
instantsearch.widgets.hits({
container: '#hits-container',
hitsPerPage: 10,
templates: {
item: getTemplate('hit'),
empty: getTemplate('no-results')
}
})
);
search.start();
};
</script>
Run Code Online (Sandbox Code Playgroud) 我正在安装Algolia 扩展Firestore 的安装程序工作得很好,它会更新添加、删除和更新的索引。但现在我想用现有数据回填它。
设置指南中提供了以下步骤,但我不知道如何运行该脚本。我尝试过将其直接粘贴到节点 shell 和 powershell 中,将其添加到 js 或 ps1 文件中并运行它,但我不知道这是什么类型的脚本。
我如何运行这个脚本?(我旁边有一个服务帐户json)
algolia ×10
javascript ×4
laravel ×2
php ×2
search ×2
firebase ×1
laravel-5 ×1
laravel-5.2 ×1
pagination ×1