Algolia搜索记录中的嵌套对象 - 一个对象中的多个facetFilters

时间:2018-03-30 00:23:01

标签: javascript firebase algolia faceted-search

我正在使用Algolia从Mongo迁移到Firebase以提供搜索。但是用一种可比的方式来搜索记录中的各个元素。

我有一个物品存放在一个房间可用时:从和到。每个记录可以有多个单独的/来自组合(参见下面的示例2)。我希望能够运行类似的搜索:

roomavailable.from <= 1522195200 AND roomavailable.to >=1522900799

但只有查询在每个元素中搜索匹配,而不是所有元素中的任何构面。 Mongo中的元素查询就是这样的。但是如果我在下面列出的记录上运行该查询,它将返回记录,因为两个roomavailable对象满足.from和.to查询。我想。

有没有办法确保搜索只是在单个对象/元素中匹配一对.from和.to?

以下是存储在Algolia中的记录的相关部分,以便您可以看到结构。

"roomavailable": [
        {
          "_id": "rJbdWvY9M",
          "from": 1522195200,
          "to": 1522799999
        },
        {
          "_id": "r1H_-vKqz",
          "from": 1523923200,
          "to": 1524268799
        }
      ],

这里是Mongo(mongoose)的等价物,它在单个元素中搜索(这是有效的):

$elemMatch: {
                    from: {
                        $lte: moment(dateArray[0]).utc().startOf('day').format()
                    },
                    to: {
                        $gte: moment(dateArray[1]).utc().endOf('day').format()
                    }
                }

我也尝试了这个查询,但似乎仍然匹配.from AND .to但是在任何单独的roomavailable元素中:

index.search({
  query: '',
  filters: filters,
  facetFilters: [roomavailable.from: 1522195200, roomavailable.to: 1524268799],
  attributesToRetrieve: [
    "roomavailable",
  ],
  restrictHighlightAndSnippetArrays: true
})

我在Algolia上发现了一些关于在facetFilters中使用1个括号和2个括号的帖子。我试过了两个。都没有工作。

任何建议都很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

编辑:请参阅关于 Algolia话语的讨论

https://discourse.algolia.com/t/how-to-match-multiple-attributes-in-nested-object-with-numericfilters/4887/8

您好@kanec,谢谢您澄清您的问题!

确实@Alefort建议(在单独的索引中使用roomavailable)是最简单的选择,因为我上面提到的查询肯定会返回你想要的结果。这意味着您必须单独查询房间可用性索引才能获得可用的ID,因此您必须使用multiple-queries

https://www.algolia.com/doc/api-reference/api-methods/multiple-queries/

也就是说,我问我们的核心API团队是否有更合理的方法来解决这个问题,但我担心由于数组的性能原因,这是一个过滤器限制。您可以在以下转换数据结构,并将您的房间编入索引object

[
  {
    "roomavailable": {
      "0": {
        "_id": "rJbdWvY9M",
        "from": 1522195200,
        "to": 1522799999
      },
      "1": {
        "_id": "r1H_-vKqz",
        "from": 1523923200,
        "to": 1524268799
      }
    }
  }
]

因此,您可以应用以下过滤器:

{
  "filters": "roomavailable.0.from <= 1522195200 AND roomavailable.0.to >= 1522799999 AND roomavailable.1.from <= 1522195200 AND roomavailable.1.to >=1522900799"
}

这样做的缺点是,您需要知道roomavailable的长度才能在前端构建搜索查询(您可以通过添加{{1}来建立索引时的搜索查询并且这可能会降低每个项目相当数量的房间的性能;在这种情况下,由于以下原因,切换到专用索引非常有意义:

  1. 如果您的后端经常更新可用房间,则不会影响其他指数的构建时间
  2. 过滤器的效果会更好(如上所述)
  3. 索引策略将更易于处理
  4. 让我知道你对此的看法,以及它是否会帮助你。