测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
授权 | MIT |
发布最新发布 | 2016年4月 |
由以下人员维护:Julien lemoine,Xavier Grand,redox,Thibault Deutsch,Clément Le Provost。
<欢迎 Swift 开发者>
2015年6月,我们发布了我们的 Swift API 客户端。
它能够与 Swift 和 Objective-C 一起工作。如果您计划在项目中使用 Swift,请使用它,因为我们不提供 Object-C API 客户端对 Swift 的支持。
Objective-C API 客户端仍然受到支持并得到更新。
</欢迎 Swift 开发者>
Algolia Search 是一个托管的全文本、数值和分类搜索引擎,能够在首次按键时提供实时结果。
我们的 Objective-C 客户端让您能够轻松地在 iOS & OS X 应用程序中使用 Algolia Search API。它封装了 Algolia Search REST API。
入门指南
命令参考
为了设置您的项目,请按照以下步骤操作
pod 'AlgoliaSearch-Client', '~> 3.5'
添加到您的 Podfile 中使用 cocoapods(如果您的项目中使用 AFNetworking 1.x,则使用 pod 'AlgoliaSearch-Client', '~> 2.0'
)或将源文件夹拖放到您的项目中(如果您没有使用 Podfile,还需要将 AFNetworking 库 添加到您的项目中)。#import "ASAPIClient.h"
添加到您的项目中ASAPIClient *apiClient =
[ASAPIClient apiClientWithApplicationID:@"YourApplicationID" apiKey:@"YourAPIKey"];
30秒内,本快速入门教程将向您展示如何索引和搜索对象。
无需任何先前的配置,您可以使用以下代码在 contacts
索引中开始索引 500位联系人
// Load JSON file
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"json"];
NSData* jsonData = [NSData dataWithContentsOfFile:jsonPath];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
// Load all objects of json file in an index named "contacts"
ASRemoteIndex *index = [apiClient getIndex:@"contacts"];
[index addObjects:dict[@"objects"] success:nil failure:nil];
现在您可以使用姓名、姓氏、公司等信息(即使有拼写错误)进行搜索。
// search by firstname
[index search:[ASQuery queryWithFullTextQuery:@"jimmie"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
// search a firstname with typo
[index search:[ASQuery queryWithFullTextQuery:@"jimie"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
// search for a company
[index search:[ASQuery queryWithFullTextQuery:@"california paint"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
// search for a firstname & company
[index search:[ASQuery queryWithFullTextQuery:@"jimmie paint"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
您可以通过自定义设置来调整搜索行为。例如,您可以将按关注者数量排序的排序方式添加到内置的优良相关性中。
NSArray *customRanking = @[@"desc(followers)"];
NSDictionary *settings = @{@"customRanking": customRanking};
[index setSettings:settings success:nil
failure:^(ASRemoteIndex *index, NSDictionary *settings, NSString *errorMessage) {
NSLog(@"Error when applying settings: %@", errorMessage);
}];
您还可以按照重要性顺序配置您想索引的属性列表(第一个=最重要的)
NSArray *customRanking = @[@"lastname", @"firstname", @"company", @"email", @"city", @"address"];
NSDictionary *settings = @{@"attributesToIndex": customRanking};
[index setSettings:settings success:nil
failure:^(ASRemoteIndex *index, NSDictionary *settings, NSString *errorMessage) {
NSLog(@"Error when applying settings: %@", errorMessage);
}];
由于该引擎旨在在您键入时提出建议,因此您通常通过前缀进行搜索。在此示例中,属性的顺序对于决定哪个命中是最优的非常重要。
[index search:[ASQuery queryWithFullTextQuery:@"or"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
[index search:[ASQuery queryWithFullTextQuery:@"jim"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
查看我们的 在线指南
索引中的每个条目都有一个唯一的标识符,称为 objectID
。有两种方法可以向索引添加条目:
objectID
分配。您将在答案中能够访问它。objectID
。您不需要显式创建索引,它将在第一次添加对象时自动创建。由于对象是无模式的,因此您不需要进行任何配置即可开始索引。如果您想要配置,设置部分提供了有关高级设置的详细信息。
自动 objectID
分配的示例
NSDictionary *newObject = @{@"firstname": @"Jimmie", @"lastname": @"Barninger"};
[index addObject:newObject
success:^(ASRemoteIndex *index, NSDictionary *object, NSDictionary *result) {
NSLog(@"Object ID: %@", result[@"objectID"]);
} failure:nil];
手动 objectID
分配的示例
NSDictionary *newObject = @{@"firstname": @"Jimmie", @"lastname": @"Barninger"};
[index addObject:newObject withObjectID:@"myID"
success:^(ASRemoteIndex *index, NSDictionary *object, NSString *objectID, NSDictionary *result) {
NSLog(@"Object ID: %@", result[@"objectID"]);
} failure:nil];
更新现有对象时,您有三个选项:
替换现有对象所有属性的示例
NSDictionary *newObject = @{
@"firstname": @"Jimmie",
@"lastname": @"Barninger",
@"city": @"New York"
};
[index saveObject:newObject objectID:@"myID" success:nil failure:nil];
有许多更新对象属性的方式
更新现有对象的城市属性示例
NSDictionary *partialObject = @{@"city": @"San Francisco"};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
添加标签的示例
NSDictionary *operation = @{
@"value": @"MyTag",
@"_operation": @"Add"
};
NSDictionary *partialObject = @{@"_tags": operation};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
删除标签的示例
NSDictionary *operation = @{
@"value": @"MyTag",
@"_operation": @"Remove"
};
NSDictionary *partialObject = @{@"_tags": operation};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
如果不存在,添加标签的示例
NSDictionary *operation = @{
@"value": @"MyTag",
@"_operation": @"AddUnique"
};
NSDictionary *partialObject = @{@"_tags": operation};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
递增值的示例
NSDictionary *operation = @{
@"value": 42,
@"_operation": @"Increment"
};
NSDictionary *partialObject = @{@"price": operation};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
注意:在这里,我们将值递增为 42
。若要递增一个,请放置 value:1
。
递减值的示例
NSDictionary *operation = @{
@"value": 42,
@"_operation": @"Decrement"
};
NSDictionary *partialObject = @{@"price": operation};
[index partialUpdateObject:partialObject objectID:@"myID" success:nil failure:nil];
注意:在这里,我们将值递减为 42
。若要递减一个,请放置 value:1
。
要执行搜索,您只需初始化索引并调用搜索函数即可。
搜索查询仅允许检索1000个结果,如果您需要为了SEO检索超过1000个结果,可以使用备份/检索全部索引内容
ASRemoteIndex *index = [apiClient getIndex:@"contacts"];
[index search:[ASQuery queryWithFullTextQuery:@"s"]
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
ASQuery *query = [ASQuery queryWithFullTextQuery:@"s"];
query.attributesToRetrieve = @[@"firstname", @"lastname"];
query.hitsPerPage = 50;
[index search:query
success:^(ASRemoteIndex *index, ASQuery *query, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
服务器响应将看起来像
{
"hits": [
{
"firstname": "Jimmie",
"lastname": "Barninger",
"objectID": "433",
"_highlightResult": {
"firstname": {
"value": "<em>Jimmie</em>",
"matchLevel": "partial"
},
"lastname": {
"value": "Barninger",
"matchLevel": "none"
},
"company": {
"value": "California <em>Paint</em> & Wlpaper Str",
"matchLevel": "partial"
}
}
}
],
"page": 0,
"nbHits": 1,
"nbPages": 1,
"hitsPerPage": 20,
"processingTimeMS": 1,
"query": "jimmie paint",
"params": "query=jimmie+paint&attributesToRetrieve=firstname,lastname&hitsPerPage=50"
}
您可以在ASQuery类中使用以下可选参数
fullTextQuery 类型:字符串 |
即时搜索查询字符串,用于设置您要在索引中搜索的字符串。如果没有设置查询参数,则文本搜索将与所有对象相匹配。 |
setQueryType 默认:prefixLast |
选择如何解释查询词。可以是以下值之一
|
setRemoveWordsIfNoResults 默认:none |
此选项用于选择策略以避免出现空的结果页面。有三个不同的选项
|
minWordSizeForApprox1 类型:数字
默认:4
|
查询词的最少字符数,以在该词中接受一个错误。 |
minWordSizeForApprox2 类型:数字
默认:8
|
查询词的最少字符数,以在该词中接受两个错误。 |
setTypoTolerance 默认:true |
此选项允许您控制结果集中允许的错误数量
|
allowTyposOnNumericTokens 默认:true |
如果设置为false,将禁用在数字标记(数字)上的错误容忍。默认为true。 |
ignorePlural 默认:false |
如果设置为true,复数不会被视为错误。例如,car和cars,或foot和feet将被视为等效。默认为false。 |
disableTypoToleranceOnAttributes 默认:[] |
您要禁用错误容忍的属性列表(必须是 |
restrictSearchableAttributes 默认:attributesToIndex |
希望用于文本搜索的属性列表(必须是 |
removeStopWords 默认:false |
在执行之前从查询中删除停用词。默认为 false。包含 41 种语言(阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、加利亚语、德语、希腊语、印地语、匈牙利语、��度尼西亚语、爱尔兰语、意大利语、日语、韩语、库尔德语、拉脱维亚语、立陶宛语、马拉地语、挪威语、波斯语、波兰语、葡萄牙语、罗马尼亚语、俄语、斯洛伐克语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语、乌尔都语)的停用词列表。在大多数使用场景中,我们不推荐启用此选项。 |
advancedSyntax 默认值:0 (false) |
启用高级查询语法。默认为 0 (false)。
|
analytics 默认:true |
如果设置为 false,则此查询将不计入分析功能。默认为 true。 |
synonyms 默认:true |
如果设置为 false,则此查询将不会使用配置中定义的同义词。默认为 true。 |
replaceSynonymsInHighlight 默认:true |
如果设置为 false,则通过同义词扩展匹配的单词将不在高亮结果显示中替换为匹配的同义词。默认为 true。 |
optionalWords 默认:[] |
包含应被视为可选的单词列表的字符串数组。 |
page 类型:整数
默认值:0
|
用于选择要检索的页面的分页参数。 |
hitsPerPage 类型:整数
默认值:20
|
用于选择每页 hit 数量的分页参数。默认为 20。 |
searchAroundLatitude:longitude 类型:浮点数,浮点数 |
搜索给定纬度/经度周围的条目。 |
searchAroundLatitude:longitude:maxDist:precision |
以给定的精度用于排名的给定纬度/经度周围搜索条目。例如,如果您设置 aroundPrecision=100,则距离将被视为 100m 的范围,例如,所有 0 和 100m 的距离将被视为 "geo" 排名参数中的相同。 |
searchAroundLatitudeLongitudeViaIP |
搜索自动从用户 IP 地址计算出的纬度/经度周围的条目。 |
searchAroundLatitudeLlongitude:precision |
自动搜索从用户IP地址计算得到的经纬度附近的条目,并给定一个精度来进行排名。例如,如果您设置精度=100,距离小于100米的两个对象将被视为“geo”排名参数中的相同。 |
searchInsideBoundingBoxWithLatitudeP1:longitudeP1:latitudeP2:longitudeP2 |
搜索由矩形的两个极端点定义的区域内的条目(由4个浮点数定义:p1Lat,p1Lng,p2Lat,p2Lng)。 |
searchInsidePolygon |
搜索由一组点定义的区域内的条目(至少由6个浮点数定义:p1Lat,p1Lng,p2Lat,p2Lng,p3Lat,p3Long)。 |
attributesToRetrieve |
您想要检索以减小JSON答复大小的属性列表。默认情况下,检索所有属性。您也可以使用 |
attributesToHighlight |
您想要根据查询高亮的属性的列表。如果一个属性查询没有匹配项,则返回原始值。默认情况下,所有索引属性都将被高亮。如果想要高亮所有属性,可以使用
|
attributesToSnippet |
您想要与要返回的单词数一起标记的属性的列表(语法为 |
getRankingInfo |
如果设置为 YES,结果命中将包含排名信息在 _rankingInfo 属性中。 |
setHighlightingTags 类型: 字符串,字符串 |
指定要插入到查询结果的高亮部分的字符串(默认为 "<em>")和要插入到查询结果的高亮部分后面的字符串(默认为 "</em>")。 |
setSnippetEllipsisText |
当摘录被截断时用作省略号标记的字符串(默认为空)。 |
numericFilters |
包含您想要应用的逗号分隔的数值筛选器的字符串。筛选器语法为 |
您可以通过使用 :
运算符轻松执行范围查询。这相当于组合 >=
和 <=
运算符。例如,numericFilters=price:10 to 1000
。
您还可以混合使用 OR 和 AND 运算符。OR 运算符以括号语法定义。例如,(code=1 AND (price:[0-100] OR price:[1000-2000]))
转换为 encodeURIComponent("code=1,(price:0 to 100,price:1000 to 2000)")
。
您还可以使用字符串数组编码(例如 numericFilters: ["price>100","price<1000"]
)。
tagFilters |
通过一组标签过滤查询。可以使用逗号分隔标签进行 AND 操作。要使用 OR 操作,必须添加括号。例如, 在索引时,应将标签添加到对象的 _tags 属性中。例如 |
facetFilters |
使用一系列分组过滤查询。分组由逗号分隔,并编码为 |
facets |
您想要用于分组的对象属性列表。对于每个声明的属性,您将能够检索与当前查询最相关的分组值及其相关计数。 属性由逗号分隔。例如, |
maxValuesPerFacet |
限制每个分组返回的分组值数量。例如, |
filters |
使用数字、分组或/和标签过滤器过滤查询。语法类似于 SQL,可以使用 OR 和 AND 关键字。底层数值、分组和标签过滤器的语法与其他过滤器相同: 关键字列表如下:
|
注意:要指定包含空格或等于关键字的值,可添加引号。
警告
FILTER1 OR (FILTER2 AND FILTER3)
的 FILTER1 OR (FILTER2 AND FILTER3)。
唯一 |
如果设置为“是”,则启用唯一特性,默认情况下不启用,如果设置了 |
要全面理解唯一
的工作原理,您可以查看我们的关于唯一的指南。
您可以通过启用搜索缓存轻松缓存搜索查询的结果。结果将在定义的时间内缓存(默认:2分钟)。没有预缓存机制,但可以通过先发制人的搜索查询来模拟。
默认情况下,缓存是禁用的。
[myIndex enableSearchCache];
或者
[myIndex enableSearchCacheWithExpiringTimeInterval:300];
您可以使用一批查询通过单个API调用来发送多个查询
// perform 3 queries in a single API call:
// - 1st query targets index `categories`
// - 2nd and 3rd queries target index `products`
NSArray *queries = @[
@{@"indexName": @"categories", @"query": anASQueryObject},
@{@"indexName": @"products", @"query": anotherASQueryObject},
@{@"indexName": @"products", @"query": anotherASQueryObject}
];
[client multipleQueries:queries
success:^(ASAPIClient *client, NSArray *queries, NSDictionary *result) {
NSLog(@"Result: %@", result);
} failure:nil];
结果JSON回答包含一个results
数组,存储底层的查询答案。答案的顺序与请求顺序相同。
您可以指定一个strategy
参数以优化您的多个查询
none
:执行查询序列直到结束。stopIfEnoughMatches
:执行查询序列,直到命中数达到已命中总和。您可以使用对象的objectID
轻松检索对象,并且可以选择指定您想要的属性列表(用逗号分隔)
// Retrieves all attributes
[index getObject:@"myID"
success:^(ASRemoteIndex *index, NSString *objectID, NSDictionary *result) {
NSLog(@"Object: %@", result);
} failure:nil];
// Retrieves only the firstname attribute
[index getObject:@"myID" attributesToRetrieve:@[@"firstname"]
success:^(ASRemoteIndex *index, NSString *objectID, NSArray *attributesToRetrieve, NSDictionary *result) {
NSLog(@"Object: %@", result);
} failure:nil];
您还可以检索一组对象
[index getObjects:@[@"myID1", @"myID2"]
success:^(ASRemoteIndex *index, NSArray *objectIDs, NSDictionary *result) {
// do something
} failure:nil];
您可以使用对象的objectID
来删除对象
[index deleteObject:@"myID" success:nil failure:nil];
您可以使用以下代码删除与单个查询匹配的所有对象。内部,API客户端执行查询,删除所有匹配的命中项,并等待删除生效。
ASQuery *query = /* [...] */;
[index deleteByQuery:query success:nil failure:nil];
您可以轻松检索或更新设置
[index getSettings:^(ASRemoteIndex *index, NSDictionary *result) {
NSLog(@"Settings: %@", result);
} failure:nil];
NSArray *customRanking = @[@"desc(followers)", @"asc(name)"];
NSDictionary *settings = @{@"customRanking": customRanking};
[index setSettings:settings success:nil failure:nil];
attributesToIndex 类型:字符串数组 |
您要索引的属性列表(即要搜索的)。 如果设置为null,则索引所有对象的所有文本和数值属性。确保更新此设置以获得最佳结果。 此参数有两个重要用途
|
attributesForFaceting 类型:字符串数组 |
您要用于分面导航的字段列表。为分面导航选定的属性中的所有字符串都将被提取并添加为分面。如果设置为 null,则不使用任何属性进行分面。 |
attributeForDistinct 类型:字符串 |
用于 |
ranking 类型:字符串数组 |
控制结果的排序方式。 我们有九个可选条件
|
customRanking 类型:字符串数组 |
允许您指定排名的一部分。 该条件的语法是一个字符串数组,包含以asc(升序)或desc(降序)运算符为前缀的属性。例如, 要全面了解自定义排名的工作原理,您可以查看我们的排名指南。 |
queryType 默认:prefixLast |
选择查询词的解释方式。它可以有以下其中一个值
|
separatorsToIndex 默认值:为空 |
指定要索引的分隔符(标点符号)。默认情况下,分隔符不被索引。使用 |
slaves |
您想复制所有写操作的索引列表。为了获得以毫秒为单位的响应时间,我们在索引时预先计算排名的一部分。如果您希望根据用例使用不同的排名配置,则需要为每个排名配置创建一个索引。此选项允许您仅在此索引上执行写操作,并自动使用相同操作更新从索引。 |
unretrievableAttributes 默认值:为空 |
无法在查询时检索的属性列表。该功能允许您具有用于索引和/或排名但不能检索的属性。默认值为null。警告:当您使用ADMIN API密钥进行测试时,此设置被忽略。 |
allowCompressionOfIntegerArray 默认:false |
允许压缩大型整数数组。在数据密集型用例中,我们建议启用此功能,然后将用户ID或权限列表作为整数数组存储。启用后,整数数组将重新排序以获得更好的压缩比。默认值为false。 |
synonyms 类型:视为相等字符串的数组数组的数组 |
例如,当您的用户在搜索dark ipad时,您可能希望检索到black ipad记录,即使单词dark不是记录的一部分。为此,您需要将black配置为dark的同义词。例如, |
placeholders 类型:单词的数组哈希 |
这是一个高级用例,用于定义可以由一组单词替换的标记,而没有原始标记可搜索。它定义为由分号将其关联到可替换单词列表的哈希。例如,
|
disableTypoToleranceOnWords 类型:字符串数组 |
指定了一个列表,在该列表上自动启用拼写容错将被禁用。 |
disableTypoToleranceOnAttributes 类型:字符串数组 |
您想禁用拼写容错的属性列表(必须是 |
altCorrections 类型:对象数组 |
指定您要考虑的替代更正。每个替代更正是由包含三个属性的对象描述的
例如 |
minWordSizefor1Typo 类型:整数
默认:4
|
接受一个错别字所需的最小字符数(默认=4)。 |
minWordSizefor2Typos 类型:整数
默认:8
|
接受两个错别字所需的最小字符数(默认=8)。 |
hitsPerPage 类型:整数
默认:10
|
每页的命中数(默认=10)。 |
attributesToRetrieve 类型:字符串数组 |
默认属性列表,用于检索对象。如果设置为null,则检索所有属性。 |
attributesToHighlight 类型:字符串数组 |
默认高亮属性列表。如果设置为null,则高亮所有索引属性。 |
attributesToSnippet 类型:字符串数组 |
默认高亮属性列表,包括要返回的单词数(格式为 |
highlightPreTag 类型:字符串 |
指定在查询结果中的高亮部分之前插入的字符串(默认为 |
highlightPostTag 类型:字符串 |
指定在查询结果中的高亮部分之后插入的字符串(默认为 |
optionalWords 类型:字符串数组 |
指定在查询中找到时应被考虑为可选的单词列表。 |
allowTyposOnNumericTokens 类型:布尔值
默认:false
|
如果设置为false,则关闭查询词中的数字标记(=数字)上的错别字容忍。例如,查询 |
ignorePlurals 类型:布尔值
默认:false
|
如果设置为true,则单复数形式不会被视为错别字(例如car/cars和foot/feet将被视为等效)。默认为false。 |
advancedSyntax 类型:整数(0或1)
默认值:0
|
启用高级查询语法。默认为0(false)。
|
replaceSynonymsInHighlight 类型:布尔值
默认:true
|
如果设置为false,则通过同义词扩展匹配的单词不会在高亮结果中以匹配的同义词替换。默认为true。 |
maxValuesPerFacet 类型:整数 |
限制每个分面返回的分面值的数量。例如: |
唯一 类型:整数(0或1)
默认值:0
|
如果设置了 要全面理解 |
typoTolerance 类型:字符串
默认:true
|
此设置有四个不同的选项
|
removeStopWords 类型:布尔值
默认:false
|
在执行查询前从查询中删除停用词。默认为否。包含41种语言的停用词(阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、汉语、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、加利西亚语、德语、希腊语、印地语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、日语、韩语、库尔德语、拉脱维亚语、立陶宛语、马拉地语、挪威语、波斯语、波兰语、葡萄牙语、罗马尼亚语、俄语、斯洛伐克语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语、乌尔都语) |
使用listIndexes
方法可以列出所有索引以及它们的相关信息(条目数、磁盘大小等)。
[client listIndexes:^(ASAPIClient *client, NSDictionary *result) {
NSLog(@"Indexes: %@", result);
} failure:nil];
可以使用索引名来删除索引。
[client deleteIndex:@"contacts" success:nil
failure:^(ASAPIClient *client, NSString *indexName, NSString *errorMessage) {
NSLog(@"Could not delete: %@", errorMessage);
}];
可以通过使用clearIndex
命令删除索引内容,而不移除设置和索引特定的API密钥。
[index clearIndex:nil
failure:^(ASRemoteIndex *index, NSString *errorMessage) {
NSLog(@"Could not clear index: %@", errorMessage);
}];
设计上,Algolia中的所有写入操作都是异步的。
这意味着,当您向索引添加或更新一个对象时,我们的服务器会立即响应对您的请求,并返回一个taskID
,表明它们已理解写入操作。
实际的插入和索引将在响应该请求之后执行。
您可以通过使用请求返回的taskID
上的waitTask
方法来等待任务完成。
例如,要等待新对象的索引
[index addObject:newObject
success:^(ASRemoteIndex *index, NSDictionary *object, NSDictionary *result) {
// Wait task
[index waitTask:result[@"taskID"]
success:^(ASRemoteIndex *index, NSString *taskID, NSDictionary *result) {
NSLog(@"New object is indexed");
} failure:nil];
} failure:nil];
如果您想确保多个对象已索引,您只需检查最大的taskID
。
您可能想要在一个API调用来执行多个操作,以减少延迟。我们提供了四种方法来执行批量操作。
addObjects
:使用自动分配的objectID
添加对象数组。saveObjects
:添加或更新具有objectID
属性的数组中的对象。deleteObjects
:删除对象ID数组。partialUpdateObjects
:部分更新包含objectID
属性的数组对象(仅更新指定的属性)。使用自动分配的objectID
的示例
NSDictionary *obj1 = @{@"firstname": @"Jimmie", @"lastname": @"Barninger"};
NSDictionary *obj2 = @{@"firstname": @"Warren", @"lastname": @"Speach"};
[index addObjects:@[obj1, obj2]
success:^(ASRemoteIndex *index, NSArray *objects, NSDictionary *result) {
NSLog(@"Object IDs: %@", result);
} failure:nil];
用户定义的objectID
(添加或更新)的示例
NSDictionary *obj1 = @{@"firstname": @"Jimmie", @"lastname": @"Barninger", @"objectID": @"myID1"};
NSDictionary *obj2 = @{@"firstname": @"Warren", @"lastname": @"Speach", @"objectID": @"myID2"};
[index saveObjects:@[obj1, obj2]
success:^(ASRemoteIndex *index, NSArray *objects, NSDictionary *result) {
NSLog(@"Object IDs: %@", result);
} failure:nil];
删除一系列记录的示例
[index deleteObjects:@[@"myID1", @"myID2"] success:nil failure:nil];
更新仅firstname
属性的示例
NSDictionary *obj1 = @{@"firstname": @"Jimmie", @"objectID": @"myID1"};
NSDictionary *obj2 = @{@"firstname": @"Warren", @"objectID": @"myID2"};
[index partialUpdateObjects:@[obj1, obj2]
success:^(ASRemoteIndex *index, NSArray *objects, NSDictionary *result) {
NSLog(@"Object IDs: %@", result);
} failure:nil];
如果您有一个用户一个索引,您可能想在几个索引上执行批量操作。我们提供了一个方法来执行此类批量操作。
NSArray *requests = @[
@{@"action": @"addObject", @"indexName": @"index1", @"body": @{@"firstname": @"Jimmie", @"lastname": @"Barninger"}},
@{@"action": @"addObject", @"indexName": @"index2", @"body": @{@"firstname": @"Warren", @"lastname": @"Speach"}}
];
[client batch:requests
success:^(ASRemoteIndex *index, NSArray *request, NSDictionary *result) {
NSLog(@"Object IDs: %@", result);
} failure:nil];
属性action
可以有以下值
ADMIN API密钥提供对所有索引的完全控制权。您还可以创建用户API密钥以控制安全性。这些API密钥可以限制为一系列操作,或/和限制为一个特定的索引。
要列出现有的密钥,可以使用listUserKeys
方法。
// Lists global API Keys
[apiClient listUserKeys:^(ASAPIClient *client, NSDictionary *result) {
NSLog(@"User keys: %@", result);
} failure:nil];
// Lists API Keys that can access only to this index
[index listUserKeys:^(ASRemoteIndex *index, NSDictionary *result) {
NSLog(@"User keys: %@", result);
} failure:nil];
每个密钥由一组权限定义,用于指定授权操作。不同的权限有:
API密钥创建示例
// Creates a new global API key that can only perform search actions
[apiClient addUserKey:@[@"search"]
success:^(ASAPIClient *client, NSArray *acls, NSDictionary *result) {
NSLog(@"API Key: %@", result[@"key"]);
} failure:nil];
// Creates a new API key that can only perform search action on this index
[index addUserKey:@[@"search"]
success:^(ASRemoteIndex *index, NSArray *acls, NSDictionary *result) {
NSLog(@"API Key: %@", result[@"key"]);
} failure:nil];
您也可以使用高级设置创建API密钥
有效期 |
添加有效期。密钥将在特定时间段(以秒为单位)内有效。 |
每小时来自每个IP地址的API调用最大次数 |
指定每小时从IP地址允许的API调用最大次数。每次使用此密钥进行API调用时,都会进行一次检查。如果在过去一个小时内,IP地址来源的调用超过了这个数字,将返回403代码。默认为0(无速率限制)。此参数可以用来防止大量查询您整个索引内容。 |
每次调用可检索的最大命中数 |
指定此API密钥在一次调用中可以检索的最大命中数。默认为0(无限)。此参数可以用来防止大量查询您整个索引内容。 |
索引 |
指定目标索引列表。您可以使用'*'字符指定以指定前缀或后缀开始的索引。例如,“dev_*”匹配所有以“dev_”开头的索引,“*_dev”匹配所有以“_dev”结尾的索引。如果为空或空白,则默认为所有索引。 |
引用者 |
指定引用者列表。您可以使用'*'字符指定以指定前缀或后缀开始的引用者。例如,“algolia.com/*”匹配所有以“algolia.com/”开头的引用者,“*.algolia.com”匹配所有以“.algolia.com”结尾的引用者。如果为空或空白,则默认为所有引用者。 |
查询参数 |
指定查询参数列表。您可以使用URL字符串格式强制查询参数(param1=X¶m2=Y...)。 |
描述 |
指定描述以说明密钥的使用情况。 |
// Creates a new index specific API key valid for 300 seconds, with a rate limit of 100 calls per hour per IP and a maximum of 20 hits
NSDictionary *params = @{@"validity": 300, @"maxQueriesPerIPPerHour": 100
, @"maxHitsPerQuery": 20, @"indexes": @[@"dev_*"], @"referers": @[@"algolia.com/*"]
, @"queryParameters": @"typoTolerance=strict&ignorePlurals=false"
, @"description": @"Limited search only API key for algolia.com"};
[index addUserKey:[@"search"] withParams:params
success:^(ASRemoteIndex *index, NSArray *acls, NSDictionary* params, NSDictionary *result) {
NSLog(@"API Key: %@", result[@"key"]);
} failure:nil];
更新现有密钥的权限
// Update an existing global API key that is valid for 300 seconds
[apiClient updateUserKey:@"myAPIKey", withACL:@[@"search"] withValidity:300 maxQueriesPerIPPerHour:0 maxHitsPerQuery:0
success:^(ASAPIClient *client, NSString *key, NSArray *acls, NSDictionary *result) {
NSLog(@"API Key: %@", result[@"key"]);
} failure:nil];
// Update an existing index specific API key valid for 300 seconds, with a rate limit of 100 calls per hour per IP and a maximum of 20 hits
[index updateUserKey:@"myAPIKey" withACL:@[@"search"] withValidity:300 maxQueriesPerIPPerHour:100 maxHitsPerQuery:20
success:^(ASRemoteIndex *index, NSString *key, NSArray *acls, NSDictionary *result) {
NSLog(@"API Key: %@", result[@"key"]);
} failure:nil];
获取指定密钥的权限
// Gets the rights of a global key
[apiClient getUserKeyACL:@"79710f2fbe18a06fdf12c17a16878654"
success:^(ASAPIClient *client, NSString *key, NSDictionary *result) {
NSLog(@"Key details: %@", result);
} failure:nil];
// Gets the rights of an index specific key
[index getUserKeyACL:@"013464b04012cb73299395a635a2fc6c"
success:^(ASRemoteIndex *index, NSString *key, NSDictionary *result) {
NSLog(@"Key details: %@", result);
} failure:nil];
删除现有密钥
// Deletes a global key
[apiClient deleteUserKey:@"79710f2fbe18a06fdf12c17a16878654" success:nil
failure:^(ASAPIClient *client, NSString *key, NSString *errorMessage) {
NSLog(@"Delete error: %@", errorMessage);
}];
// Deletes an index specific key
[index deleteUserKey:@"013464b04012cb73299395a635a2fc6c" success:nil
failure:^(ASRemoteIndex *index, NSString *key, NSString *errorMessage) {
NSLog(@"Delete error: %@", errorMessage);
}];
您可以使用copy
和move
命令轻松地复制或重命名现有索引。注意:移动和复制命令会覆盖目标索引。
// Rename MyIndex in MyIndexNewName
[apiClient moveIndex:@"MyIndex" to:@"MyIndexNewName"
success:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSDictionary *result) {
NSLog(@"Move Success: %@", result);
} failure:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSString *errorMessage) {
NSLog(@"Move Failure: %@", errorMessage);
}];
// Copy MyIndex in MyIndexCopy
[apiClient copyIndex:@"MyIndex" to:@"MyIndexCopy"
success:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSDictionary *result) {
NSLog(@"Copy Success: %@", result);
} failure:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSString *errorMessage) {
NSLog(@"Copy Failure: %@", errorMessage);
}];
移动命令特别有用,如果您想原子性地从旧版本更新到新版本的大索引。例如,如果您通过批处理每晚从数据库重新创建您的索引MyIndex
,您只需要
MyNewIndex
。MyNewIndex
重命名为MyIndex
。这会自动覆盖旧索引,新查询将在新索引上提供。// Rename MyNewIndex in MyIndex (and overwrite it)
[apiClient moveIndex:@"MyNewIndex" to:@"MyIndex"
success:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSDictionary *result) {
NSLog(@"Move Success: %@", result);
} failure:^(ASAPIClient *client, NSString *srcIndexName, NSString *dstIndexName, NSString *errorMessage) {
NSLog(@"Move Failure: %@", errorMessage);
}];
search
方法无法返回超过1,000个结果。如果您需要检索您索引的所有内容(用于备份、SEO目的或在其上运行脚本),请改用browse
方法。此方法可以让您检索超过1,000个限制的对象。
此方法针对速度进行了优化。为了实现快速和精确,禁用了唯一识别、拼写容错、词近、地理距离和匹配单词数量。结果还将根据属性和自定义排名进行排序。
它将与数据一起返回一个光标
,您可以使用它来检索记录的下一部分。
您可以在第一次browse
调用中指定自定义参数(如page
或hitsPerPage
),然后这些参数将包含在光标
中。请注意,第一次调用无法访问第1,000条记录之外的记录。
示例
// Iterate with a filter over the index
[index browseWithQuery:query block:^(ASBrowseIterator *iterator, BOOL end, NSString *error) {
// Retrieve the next cursor from the browse method
NSLog(iterator.cursor);
if (error != nil) {
// Handle errors
} else if (end) {
// End of the index
} else {
// Do something
[iterator next];
}
}];
您可以通过此API检索最新的日志。每个日志条目包含:
您可以使用偏移量/长度参数检索您最后1,000次API调用的日志并浏览它们
偏移量 |
指定要检索的第一个条目(基于0,0是最新的日志条目)。默认为0。 |
长度 |
指定从偏移量开始的要检索的最大条目数。默认为10。允许的最大值:1,000。 |
onlyErrors |
仅检索HTTP代码与200或201不同的日志。(已弃用) |
类型 |
指定要检索的日志类型
|
// Get last 10 log entries
[apiClient getLogs:^(ASAPIClient *client, NSDictionary *result) {
NSLog(@"GetLogs success: %@", result);
} failure:^(ASAPIClient *client, NSString *errorMessage) {
NSLog(@"GetLogs failure: %@", errorMessage);
}];
// Get last 100 log entries
[apiClient getLogsWithOffset:0 length:100
success:^(ASAPIClient *client, NSUInteger offset, NSUInteger length, NSDictionary *result) {
NSLog(@"GetLog success: %@", result);
} failure:^(ASAPIClient *client, NSUInteger offset, NSUInteger length, NSString *errorMessage) {
NSLog(@"GetLogs failure: %@", errorMessage);
}];