AlgoliaSearch-Client 3.7.0

AlgoliaSearch-Client 3.7.0

测试已测试
Lang语言 Obj-CObjective C
授权 MIT
发布最新发布2016年4月

由以下人员维护:Julien lemoineXavier GrandredoxThibault DeutschClément Le Provost



  • Algolia

Algolia Search API 客户端 for iOS 和 OS X

<欢迎 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

目录

入门指南

  1. 设置
  2. 快速开始

  3. 指南与教程

命令参考

  1. 添加新对象
  2. 更新对象
  3. 搜索
  4. 搜索缓存
  5. 多查询
  6. 获取对象
  7. 删除对象
  8. 按查询删除
  9. 索引设置
  10. 列出索引
  11. 删除索引
  12. 清除索引
  13. 等待索引
  14. 批量写入
  15. 安全/用户 API 密钥
  16. 复制或重命名索引
  17. 备份/检索所有索引内容
  18. 日志

设置

为了设置您的项目,请按照以下步骤操作

  1. 下载并添加代码到您的项目中,或者通过将 pod 'AlgoliaSearch-Client', '~> 3.5' 添加到您的 Podfile 中使用 cocoapods(如果您的项目中使用 AFNetworking 1.x,则使用 pod 'AlgoliaSearch-Client', '~> 2.0')或将源文件夹拖放到您的项目中(如果您没有使用 Podfile,还需要将 AFNetworking 库 添加到您的项目中)。
  2. #import "ASAPIClient.h" 添加到您的项目中
  3. 使用您的 ApplicationID 和 API-Key 初始化客户端。您可以在 您的Algolia账户 中找到所有的信息。
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。有两种方法可以向索引添加条目:

  1. 使用自动的 objectID 分配。您将在答案中能够访问它。
  2. 提供您自己的 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];

更新索引中的现有对象

更新现有对象时,您有三个选项:

  1. 替换所有其属性。
  2. 仅替换一些属性。
  3. 对某些属性应用操作。

替换现有对象所有属性的示例

NSDictionary *newObject = @{
    @"firstname": @"Jimmie",
    @"lastname": @"Barninger",
    @"city": @"New York"
};
[index saveObject:newObject objectID:@"myID" success:nil failure:nil];

有许多更新对象属性的方式

  1. 设置属性值
  2. 向数组添加字符串或数字元素
  3. 从数组中删除元素
  4. 如果不存在,则向数组添加字符串或数字元素
  5. 递增属性
  6. 递减属性

更新现有对象的城市属性示例

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

选择如何解释查询词。可以是以下值之一

  • prefixAll:所有查询词都被解释为前缀。此选项不推荐使用。
  • prefixLast:只有最后一个词被解释为前缀(默认行为)。
  • prefixNone:没有查询词被解释为前缀。此选项不推荐使用。
setRemoveWordsIfNoResults
默认:none

此选项用于选择策略以避免出现空的结果页面。有三个不同的选项

  • lastWords:当查询没有返回任何结果时,最后一个词将作为可选添加。然后使用n-1词、n-2词,...重复此过程,直到有结果。
  • firstWords:当查询没有返回任何结果时,第一个词将作为可选添加。然后使用第二个词、第三个词,...重复此过程,直到有结果。
  • allOptional:当查询没有返回任何结果时,将再次尝试使用所有词作为可选进行第二次试验。这等同于将查询词之间的AND运算符转换为OR运算符。
  • none:当查询没有返回任何结果时,不做任何特定处理(默认行为)。
minWordSizeForApprox1
类型:数字
默认:4

查询词的最少字符数,以在该词中接受一个错误。
默认为4。

minWordSizeForApprox2
类型:数字
默认:8

查询词的最少字符数,以在该词中接受两个错误。
默认为8。

setTypoTolerance
默认:true

此选项允许您控制结果集中允许的错误数量

  • true:启用错误容忍,并检索所有匹配的命中结果(默认行为)。
  • false:禁用错误容忍。将隐藏所有包含错误的的结果。
  • min:仅保留具有最少错误数量的结果。例如,如果一个结果无错误匹配,那么所有包含错误的将隐藏。
  • strict:如果有无错误匹配的结果,将不检索有2个错误匹配的命中。
allowTyposOnNumericTokens
默认:true

如果设置为false,将禁用在数字标记(数字)上的错误容忍。默认为true。

ignorePlural
默认:false

如果设置为true,复数不会被视为错误。例如,car和cars,或foot和feet将被视为等效。默认为false。

disableTypoToleranceOnAttributes
默认:[]

您要禁用错误容忍的属性列表(必须是attributesToIndex索引设置的子集)。属性用逗号分隔,例如"name,address"。您还可以使用JSON字符串数组编码,例如encodeURIComponent("[\"name\",\"address\"]")。默认情况下,此列表为空。

restrictSearchableAttributes
默认:attributesToIndex

希望用于文本搜索的属性列表(必须是 attributesToIndex 索引设置的子集)。属性用逗号分隔,如 "name,address"。还可以使用 JSON 字符串数组编码,例如 encodeURIComponent("[\"name\",\"address\"]")。默认情况下,所有在 attributesToIndex 设置中指定的属性都将用于搜索。

removeStopWords
默认:false

在执行之前从查询中删除停用词。默认为 false。包含 41 种语言(阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、加利亚语、德语、希腊语、印地语、匈牙利语、��度尼西亚语、爱尔兰语、意大利语、日语、韩语、库尔德语、拉脱维亚语、立陶宛语、马拉地语、挪威语、波斯语、波兰语、葡萄牙语、罗马尼亚语、俄语、斯洛伐克语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语、乌尔都语)的停用词列表。在大多数使用场景中,我们不推荐启用此选项。

advancedSyntax
默认值:0 (false)

启用高级查询语法。默认为 0 (false)。

  • 短语查询:短语查询定义一组特定的术语序列。短语查询由 Algolia 的查询解析器用于引号内的单词。例如,"search engine" 只检索拥有 searchengine 相邻的记录。短语查询中 禁用 错别字容忍。
  • 禁止操作符:禁止操作符排除包含 - 符号之后的术语的记录。例如,search -engine 将检索包含 search 但不包含 engine 的记录。
analytics
默认:true

如果设置为 false,则此查询将不计入分析功能。默认为 true。

synonyms
默认:true

如果设置为 false,则此查询将不会使用配置中定义的同义词。默认为 true。

replaceSynonymsInHighlight
默认:true

如果设置为 false,则通过同义词扩展匹配的单词将不在高亮结果显示中替换为匹配的同义词。默认为 true。

optionalWords
默认:[]

包含应被视为可选的单词列表的字符串数组。

分页参数

page
类型:整数
默认值:0

用于选择要检索的页面的分页参数。
页数从 0 开始,默认为 0。因此,要检索 10 页,您需要将 page=9 设置。

hitsPerPage
类型:整数
默认值:20

用于选择每页 hit 数量的分页参数。默认为 20。

地理搜索参数

searchAroundLatitude:longitude
类型:浮点数,浮点数

搜索给定纬度/经度周围的条目。
最大距离将根据区域密度自动猜测,但您还可以使用 maxDist 参数手动指定以米为单位的最大距离。
在索引时,您应使用包含 _geoloc 属性的地理位置来指定对象的地理位置,其格式为 {"_geoloc":{"lat":48.853409, "lng":2.348800}}

searchAroundLatitude:longitude:maxDist:precision

以给定的精度用于排名的给定纬度/经度周围搜索条目。例如,如果您设置 aroundPrecision=100,则距离将被视为 100m 的范围,例如,所有 0 和 100m 的距离将被视为 "geo" 排名参数中的相同。

searchAroundLatitudeLongitudeViaIP

搜索自动从用户 IP 地址计算出的纬度/经度周围的条目。
半径将根据密度自动猜测,但您也可以使用 maxDist 参数手动指定(可选)。
在索引时,您应使用包含 _geoloc 属性的地理位置来指定对象的地理位置,其格式为 {"_geoloc":{"lat":48.853409, "lng":2.348800}}

searchAroundLatitudeLlongitude:precision

自动搜索从用户IP地址计算得到的经纬度附近的条目,并给定一个精度来进行排名。例如,如果您设置精度=100,距离小于100米的两个对象将被视为“geo”排名参数中的相同。

searchInsideBoundingBoxWithLatitudeP1:longitudeP1:latitudeP2:longitudeP2

搜索由矩形的两个极端点定义的区域内的条目(由4个浮点数定义:p1Lat,p1Lng,p2Lat,p2Lng)。
例如,searchInsideBoundingBoxWithLatitudeP1(47.3165, 4.9665, 47.3424, 5.0201))。
在索引过程中,您应该使用 _geoloc 属性指定对象的地理定位(格式为 "_geoloc":{"lat":48.853409, "lng":2.348800},或者如果有多个地理定位,格式为 "_geoloc":[{"lat":48.853409, "lng":2.348800},{"lat":48.547456, "lng":2.972075}])。您可以通过传入超过4个值来使用多个边界框(OR)。例如,您可以用8个值替代4个值,以搜索两个边界框的并集。

searchInsidePolygon

搜索由一组点定义的区域内的条目(至少由6个浮点数定义:p1Lat,p1Lng,p2Lat,p2Lng,p3Lat,p3Long)。
例如 searchInsidePolygon(47.3165, 4.9665, 47.3424, 5.0201, 47.32, 4.98))。
在索引过程中,您应该使用 _geoloc 属性指定对象的地理定位(格式为 "_geoloc":{"lat":48.853409, "lng":2.348800},或者如果有多个地理定位,格式为 "_geoloc":[{"lat":48.853409, "lng":2.348800},{"lat":48.547456, "lng":2.972075}])。

控制结果内容参数

attributesToRetrieve

您想要检索以减小JSON答复大小的属性列表。默认情况下,检索所有属性。您也可以使用 * 在您的索引中指定 attributesToRetrieve 设置来检索所有值。

attributesToHighlight

您想要根据查询高亮的属性的列表。如果一个属性查询没有匹配项,则返回原始值。默认情况下,所有索引属性都将被高亮。如果想要高亮所有属性,可以使用 *。每个高亮属性都将返回一个匹配级别,它可能包含

  • full:如果查询术语在属性中全部找到。
  • partial:如果只有一些查询术语被找到。
  • none:如果一个查询术语都没有被找到。
attributesToSnippet

您想要与要返回的单词数一起标记的属性的列表(语法为 attributeName:nbWords)。默认情况下,不计算摘要。

getRankingInfo

如果设置为 YES,结果命中将包含排名信息在 _rankingInfo 属性中。

setHighlightingTags
类型: 字符串,字符串

指定要插入到查询结果的高亮部分的字符串(默认为 "<em>")和要插入到查询结果的高亮部分后面的字符串(默认为 "</em>")。

setSnippetEllipsisText

当摘录被截断时用作省略号标记的字符串(默认为空)。

数值搜索参数

numericFilters

包含您想要应用的逗号分隔的数值筛选器的字符串。筛选器语法为 attributeName 后跟 operand 然后跟 value。支持的运算符是 <<==>>=

您可以通过使用 : 运算符轻松执行范围查询。这相当于组合 >=<= 运算符。例如,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=tag1,(tag2,tag3) 表示 tag1 AND (tag2 OR tag3)。也可以使用字符串数组编码。例如,tagFilters: ["tag1",["tag2","tag3"]] 表示 tag1 AND (tag2 OR tag3)

在索引时,应将标签添加到对象的 _tags 属性中。例如 {"_tags":["tag1","tag2"]}

分组参数

facetFilters

使用一系列分组过滤查询。分组由逗号分隔,并编码为 attributeName:value。要使用 OR 操作,必须添加括号。例如:facetFilters=(category:Book,category:Movie),author:John%20Doe。您还可以使用字符串数组编码。例如,[["category:Book","category:Movie"],"author:John%20Doe"]

facets

您想要用于分组的对象属性列表。对于每个声明的属性,您将能够检索与当前查询最相关的分组值及其相关计数。

属性由逗号分隔。例如,"category,author"。您还可以使用 JSON 字符串数组编码。例如,["category","author"]。只有已添加到 attributesForFaceting 索引设置中的属性才能用于此参数。您还可以使用 *attributesForFaceting 中指定的所有属性上执行分组。如果结果数量很重要,计数可以是大致值,响应中的 exhaustiveFacetsCount 属性设置为 true 时表示计数是精确的。

maxValuesPerFacet

限制每个分组返回的分组值数量。例如,maxValuesPerFacet=10 将检索每个分组最多 10 个值。

统一过滤参数(类似 SQL)

filters

使用数字、分组或/和标签过滤器过滤查询。语法类似于 SQL,可以使用 OR 和 AND 关键字。底层数值、分组和标签过滤器的语法与其他过滤器相同:available=1 AND (category:Book OR NOT category:Ebook) AND public date: 1441745506 TO 1441755506 AND inStock > 0 AND author:"John Doe"

关键字列表如下:

  • OR:在两个过滤器之间创建析取过滤器。
  • AND:在两个过滤器之间创建合取过滤器。
  • TO:用于指定数值过滤器的范围。
  • NOT:用于否定过滤器。不允许使用 - 语法。

注意:要指定包含空格或等于关键字的值,可添加引号。

警告

  • 与其他过滤器一样(出于性能原因),无法有 FILTER1 OR (FILTER2 AND FILTER3) 的 FILTER1 OR (FILTER2 AND FILTER3)。
  • 无法在 OR 内混合不同类别的过滤器,如 num=3 OR tag1 OR facet:value。
  • 无法否定组,只能否定过滤器:NOT(FILTER1 OR (FILTER2)) 是不允许的。

唯一参数

唯一

如果设置为“是”,则启用唯一特性,默认情况下不启用,如果设置了attributeForDistinct索引设置。此特性类似于SQL中的“distinct”关键字。在查询中启用distinct=1参数时,将删除包含attributeForDistinct属性重复值的所有条目。例如,如果选择的属性是show_name,并且有多个条目的show_name具有相同值,那么只保留最好的一个,其他将被删除。

要全面理解唯一的工作原理,您可以查看我们的关于唯一的指南

搜索缓存

您可以通过启用搜索缓存轻松缓存搜索查询的结果。结果将在定义的时间内缓存(默认: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,则索引所有对象的所有文本和数值属性。确保更新此设置以获得最佳结果。

此参数有两个重要用途

  • 限制要索引的属性.
    例如,如果您存储了一张图片的URL,您希望存储它并能够检索它,但您可能不想在URL中进行搜索。
  • 控制排名的一部分.
    列表开头的属性匹配将比列表下方的匹配更重要。在一个属性中,属性头部的匹配文本将被认为比后面的文本更重要。如果你希望禁用这种行为,可以在 unordered(AttributeName) 内添加你的属性。例如,attributesToIndex: ["title", "unordered(text)"]。你可以通过使用逗号作为分隔符的同一字符串传递它们来决定两个属性具有相同的优先级。例如,在这个例子中 titlealternative_title 具有相同的优先级,这与文本优先级不同:attributesToIndex:["title,alternative_title", "text"]。要了解排名的完整描述,您可以查看我们的排名指南
  • numericAttributesToIndex:(字符串数组)所有数值属性都会自动作为数值过滤器进行索引(允许进行过滤操作如 <<=)。如果你不需要对你的某些数值属性进行过滤,你可以指定此列表以加快索引速度。
    如果您只需使用操作符 '=' 过滤数值,可以通过指定 equalOnly(AttributeName) 来加速索引操作。其他操作符将禁用。
attributesForFaceting
类型:字符串数组

您要用于分面导航的字段列表。为分面导航选定的属性中的所有字符串都将被提取并添加为分面。如果设置为 null,则不使用任何属性进行分面。

attributeForDistinct
类型:字符串

用于 Distinct 功能的属性名称。此功能类似于 SQL 的 "distinct" 关键字。当在带有 distinct=1 参数的查询中启用时,所有包含该属性重复值的条目都将从结果中删除。例如,如果选择的属性是 show_name,并且多个条目具有相同的 show_name 值,则仅保留第一个,其他被从结果中删除。要全面了解 Distinct 的工作原理,您可以查看我们关于 Distinct 的指南

ranking
类型:字符串数组

控制结果的排序方式。

我们有九个可选条件

  • typo:根据错误数进行排序。
  • geo:在执行基于地理位置的搜索时,根据递减的距离进行排序。
  • words:根据匹配的查询词数量以递减顺序进行排序。此参数在你使用 optionalWords 查询参数以有结果中匹配词数最多的结果首先显示时很有用。
  • proximity:根据查询词在条目中的邻近度进行排序。
  • attribute:根据在 attributesToIndex 中定义的属性顺序进行排序。
  • exact:
    • 如果用户查询包含一个单词:将具有与查询词完全匹配的属性的条目对象的排序排序在其他对象之前。例如,如果你搜索电视节目 "V",你希望使用 "V" 查询找到它,并避免在它之前显示所有以字母 V 开头的热门电视节目。
    • 如果用户查询包含多个单词:根据单词的精确匹配数(而不是作为前缀)进行排序。
  • custom:根据在 customRanking 属性中设置的由用户定义的公式进行排序。
  • asc(attributeName):根据以升序排序的数值属性。 attributeName 可以是你记录中任何数值属性的名字(整数、双精度或布尔类型)。
  • desc(attributeName):根据以降序排序的数值属性。 attributeName 可以是你记录中任何数值属性的名字(整数、双精度或布尔类型)。
    标准顺序是 ["typo", "geo", "words", "proximity", "attribute", "exact", "custom"]。要了解排名的完整描述,您可以查看我们的排名指南
customRanking
类型:字符串数组

允许您指定排名的一部分。

该条件的语法是一个字符串数组,包含以asc(升序)或desc(降序)运算符为前缀的属性。例如,"customRanking" => ["desc(population)", "asc(name)"]

要全面了解自定义排名的工作原理,您可以查看我们的排名指南

queryType
默认:prefixLast

选择查询词的解释方式。它可以有以下其中一个值

  • prefixAll:所有查询词都解释为前缀。
  • prefixLast:只有最后一个词被解释为前缀(默认行为)。
  • prefixNone:没有查询词被解释为前缀。此选项不推荐使用。
separatorsToIndex
默认值:为空

指定要索引的分隔符(标点符号)。默认情况下,分隔符不被索引。使用+#可搜索Google+或C#。

slaves

您想复制所有写操作的索引列表。为了获得以毫秒为单位的响应时间,我们在索引时预先计算排名的一部分。如果您希望根据用例使用不同的排名配置,则需要为每个排名配置创建一个索引。此选项允许您仅在此索引上执行写操作,并自动使用相同操作更新从索引。

unretrievableAttributes
默认值:为空

无法在查询时检索的属性列表。该功能允许您具有用于索引和/或排名但不能检索的属性。默认值为null。警告:当您使用ADMIN API密钥进行测试时,此设置被忽略。

allowCompressionOfIntegerArray
默认:false

允许压缩大型整数数组。在数据密集型用例中,我们建议启用此功能,然后将用户ID或权限列表作为整数数组存储。启用后,整数数组将重新排序以获得更好的压缩比。默认值为false。

查询扩展

synonyms
类型:视为相等字符串的数组数组的数组

例如,当您的用户在搜索dark ipad时,您可能希望检索到black ipad记录,即使单词dark不是记录的一部分。为此,您需要将black配置为dark的同义词。例如,"synomyms": [ [ "black", "dark" ], [ "small", "little", "mini" ], ... ]。同义词功能也支持多词表达式,如"synonyms": [ ["NYC", "New York City"] ]

placeholders
类型:单词的数组哈希

这是一个高级用例,用于定义可以由一组单词替换的标记,而没有原始标记可搜索。它定义为由分号将其关联到可替换单词列表的哈希。例如,"placeholders": { "<streetnumber>": ["1", "2", "3", ..., "9999"]}可以匹配所有街号。我们使用< >标签语法在属性中定义占位符。例如

  • 推送一个带有占位符的记录:{ "name" : "Apple Store", "address" : "&lt;streetnumber&gt; Opera street, Paris" }
  • 在您的索引设置中配置占位符:"placeholders": { "<streetnumber>" : ["1", "2", "3", "4", "5", ... ], ... }
disableTypoToleranceOnWords
类型:字符串数组

指定了一个列表,在该列表上自动启用拼写容错将被禁用。

disableTypoToleranceOnAttributes
类型:字符串数组

您想禁用拼写容错的属性列表(必须是attributesToIndex索引设置的子集)。默认列表为空。

altCorrections
类型:对象数组

指定您要考虑的替代更正。每个替代更正是由包含三个属性的对象描述的

  • word:要更正的单词。
  • correction:更正后的单词。
  • nbTypos 要为排名算法考虑的错别字数量(1或2)(1个错别字比2个错别字好)。

例如 "altCorrections": [{ "word": "foot", "correction": "feet", "nbTypos": 1 }, { "word": "feet", "correction": "foot", "nbTypos": 1 } ]

默认查询参数(可以被查询覆盖)

minWordSizefor1Typo
类型:整数
默认:4

接受一个错别字所需的最小字符数(默认=4)。

minWordSizefor2Typos
类型:整数
默认:8

接受两个错别字所需的最小字符数(默认=8)。

hitsPerPage
类型:整数
默认:10

每页的命中数(默认=10)。

attributesToRetrieve
类型:字符串数组

默认属性列表,用于检索对象。如果设置为null,则检索所有属性。

attributesToHighlight
类型:字符串数组

默认高亮属性列表。如果设置为null,则高亮所有索引属性。

attributesToSnippet
类型:字符串数组

默认高亮属性列表,包括要返回的单词数(格式为attributeName:nbWords)。
默认没有计算摘要。如果设置为null,则不计算摘要。

highlightPreTag
类型:字符串

指定在查询结果中的高亮部分之前插入的字符串(默认为<em>)。

highlightPostTag
类型:字符串

指定在查询结果中的高亮部分之后插入的字符串(默认为</em>)。

optionalWords
类型:字符串数组

指定在查询中找到时应被考虑为可选的单词列表。

allowTyposOnNumericTokens
类型:布尔值
默认:false

如果设置为false,则关闭查询词中的数字标记(=数字)上的错别字容忍。例如,查询"304"将与"30450"匹配,但不能与启用错别字容忍时的情况匹配。这对于搜索序列号和邮编非常有用。默认为false。

ignorePlurals
类型:布尔值
默认:false

如果设置为true,则单复数形式不会被视为错别字(例如car/cars和foot/feet将被视为等效)。默认为false。

advancedSyntax
类型:整数(0或1)
默认值:0

启用高级查询语法。默认为0(false)。

  • 短语查询:短语查询定义术语的特定序列。短语查询是由Algolia查询分析器为括号内的词构建的。例如,"search engine"只检索具有searchengine旁边记录。在短语查询中禁用错别字容忍。

  • 禁止操作符:禁止操作符排除包含-符号之后术语的记录。例如 search -engine 将检索包含search但不包含engine的记录。

replaceSynonymsInHighlight
类型:布尔值
默认:true

如果设置为false,则通过同义词扩展匹配的单词不会在高亮结果中以匹配的同义词替换。默认为true。

maxValuesPerFacet
类型:整数

限制每个分面返回的分面值的数量。例如:maxValuesPerFacet=10将每个分面检索最多10个值。

唯一
类型:整数(0或1)
默认值:0

如果设置了attributeForDistinct索引设置,则启用(默认禁用)唯一功能。此功能类似于SQL的“distinct”关键字:如果查询中包含distinct=1参数并启用,则将移除包含attributeForDistinct属性重复值的所有命中。例如,如果所选属性是show_name并且多个命中对show_name具有相同的值,那么只保留最佳的一个并将其余移除。

要全面理解唯一的工作原理,您可以查看我们的关于唯一的指南

typoTolerance
类型:字符串
默认:true

此设置有四个不同的选项

  • true: 激活错别字容忍(默认值)。

  • false: 禁用错别字容忍

  • min: 仅保留最少量的拼写错误的搜索结果。例如,如果一个结果全无拼音错误,那么在有拼错的搜索结果会被隐藏。

  • strict: 如果有无拼音错误的匹配结果,则删除所有有两个或以上拼音错误的搜索结果。

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可以有以下值

  • addObject
  • updateObject
  • partialUpdateObject
  • partialUpdateObjectNoCreate
  • deleteObject

安全/用户API密钥

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检索所有索引内容。
  • 添加对象:允许在索引中添加/更新对象。
  • 删除对象:允许删除现有对象。
  • 删除索引:允许删除索引内容。
  • 设置:允许获取索引设置。
  • 编辑设置:允许更改索引设置。
  • 分析:允许通过分析API获取分析数据。
  • 列出索引:允许列出所有可访问的索引。

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);
}]; 

复制或重命名索引

您可以使用copymove命令轻松地复制或重命名现有索引。注意:移动和复制命令会覆盖目标索引。

// 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,您只需要

  1. 使用批处理将您的数据库导入到新索引中。让我们称这个新索引为MyNewIndex
  2. 使用移动命令将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调用中指定自定义参数(如pagehitsPerPage),然后这些参数将包含在光标中。请注意,第一次调用无法访问第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检索最新的日志。每个日志条目包含:

  • ISO-8601格式的时间戳
  • 客户端IP
  • 请求头(API密钥已模糊处理)
  • 请求URL
  • 请求方法
  • 请求正文
  • 响应HTTP代码
  • 响应正文
  • 条目的SHA1 ID

您可以使用偏移量/长度参数检索您最后1,000次API调用的日志并浏览它们

偏移量

指定要检索的第一个条目(基于0,0是最新的日志条目)。默认为0。

长度

指定从偏移量开始的要检索的最大条目数。默认为10。允许的最大值:1,000。

onlyErrors

仅检索HTTP代码与200或201不同的日志。(已弃用)

类型

指定要检索的日志类型

  • query:仅检索查询。
  • build:仅检索构建操作。
  • 错误:仅检索错误(与onlyErrors参数相同)。
// 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);
}];