【问题标题】:How can I query Algolia to find all documents missing a particular key?如何查询 Algolia 以查找所有缺少特定键的文档?
【发布时间】:2016-11-15 03:52:54
【问题描述】:

如果我的 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 这样的对象,因为它们都缺少“颜色”属性。

我一直在拖累 (@987654321 @) 但我找不到答案。

我试过这个 sn-p 但没有运气:

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)

【问题讨论】:

    标签: python algolia


    【解决方案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', ... })
    

    【讨论】:

      【解决方案2】:

      我确信有更优雅的解决方案,但这似乎适用于您提供的内容(我还假设您的 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
      

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

      【讨论】:

      • 对不起,我刚刚意识到我的问题事先措辞是多么笼统。我已经对其进行了编辑,以更具体地使用 Algolia。如果我从索引中获取所有对象,您的解决方案肯定是可用的,但我试图避免这种情况并让技术为我工作。
      猜你喜欢
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多