如何查询 Algolia 以查找缺少特定键的所有文档?

How can I query Algolia to find all documents missing a particular key?

如果我有一个包含如下文档的 Algolia 索引:

{"object_id":1, "color":"red", "shape":"circle"}
{"object_id":2, "color":"blue", "shape":"triangle"}
{"object_id":3, "color":"green", "shape":"square"}
{"object_id":4, "color":null, "shape":"hexagon"}
{"object_id":5, "shape":"hexagon"}
...

对 Algolia 使用 python API,我如何搜索索引以获取像 4 和 5 这样的对象,因为它们都缺少 "color" 属性。

我一直在拖(https://www.algolia.com/doc/api-client/python/search#search-in-an-index),但我找不到答案。

我试过这个片段,但没有成功:

from algoliasearch import algoliasearch

client = algoliasearch.Client("YourApplicationID", 'YourAPIKey')
index = client.init_index("colorful_shapes")
res = index.search("null")
res1 = index.search("color=null")
res2 = index.search("color:null")
res3 = index.search("!color")
print(res, res1, res2, res3)

我确信有更优雅的解决方案,但这似乎适用于您提供的内容(我还假设您的 null 是预期的 None):

a = [{"object_id":1, "color":"red", "shape":"circle"}, {"object_id":2, "color":"blue", "shape":"triangle"}, {"object_id":3, "color":"green", "shape":"square"}, {"object_id":4, "color":None, "shape":"hexagon"}, {"object_id":5, "shape":"hexagon"}]
list(a) #since dict has no set order
for i in a:
    try:
        if (i['color'] is None):
            print(a.index(i)) #prints 3
    except KeyError:
        print(a.index(i)) #prints 4

我知道您希望打印 45,但索引从 0 开始计数,只需在每个打印语句中加 1 即可轻松更改。

不幸的是,在 Algolia 中搜索所有缺少键的对象是不可能的(顺便说一句,对于无模式的 NoSQL 引擎来说相当复杂)。

一个简单的解决方法是在索引时推送一个标签来指定是否设置了属性:

{
  "objectID": 1,
  "myattr": "I'm set",
  "_tags": ["myattr_set"]
}

{
  "objectID": 2,
  "_tags": ["myattr_unset"]
}

在查询时,您将使用 tag:

过滤搜索
index.search('your query', { filters: 'myattr_unset', ... })