简体   繁体   English

ArangoDB是否有分面搜索?

[英]Does ArangoDB have faceted search?

Does anyone know whether ArangoDB supports faceted search and how performance compares to other products that support it well (eg, Solr, MarkLogic) or those that don't (eg, Mongo)? 有谁知道ArangoDB是否支持分面搜索以及性能与其他支持它的产品(例如Solr,MarkLogic)或不支持它的产品(例如Mongo)相比如何?

After searching the site, reading the docs, and searching the Google group, I don't see it discussed anywhere. 在搜索网站,阅读文档以及搜索Google网上论坛后,我认为不会在任何地方进行讨论。

Thanks 谢谢

ArangoDB has a query language, which supports group-by like queries. ArangoDB有一种查询语言,支持分组查询。 That allows you to implement a faceted search. 这允许您实现分面搜索。 To be certain we have the same understanding of faceted searching, just let me explain, what I think is meant by it. 为了确定我们对分面搜索有相同的理解,让我解释一下,我认为它是什么意思。 You have a - for example - a list of products. 例如,您有一个产品清单。 Each product has some attributes (eg name, model) and some categories (eg manufacturer). 每种产品都有一些属性(例如名称,型号)和一些类别(例如制造商)。 I can then search for a name or a name containing a word. 然后我可以搜索包含单词的名称或名称。 This will list all products plus an indication how many products are in which category. 这将列出所有产品以及指示在哪个类别中有多少产品。 Is that what you meant? 这是你的意思吗?

So for examples: Assume you have documents which have three attributes (name, attribute1, attribute2) and two categories (category1, category2): 因此,举例:假设您有三个属性(name,attribute1,attribute2)和两个类别(category1,category2)的文档:

> for (i = 0; i < 10000; i++) db.products.save({category1: i % 5, category2: i % 7, attribute1: i % 13, attribute2: i % 17, name: "Lore Ipsum " + i, productId: i})

so a typical document is: 所以典型的文件是:

> db.products.any()
{
  "_id" : "products/8788564659",
  "_rev" : "8788564659",
  "_key" : "8788564659",
  "productId" : 9291,
  "category1" : 1,
  "category2" : 2,
  "attribute1" : 9,
  "attribute2" : 9,
  "name" : "Lore Ipsum 9291"
}

If you want to search for all documents that have attribute1 between 2 and 3 (inclusive), you could use 如果要搜索属性1在2和3(含)之间的所有文档,可以使用

> db._query("FOR p IN products FILTER p.attribute1 >= 2 && p.attribute1 <= 3 SORT p.name LIMIT 3 RETURN p").toArray();
[
  {
    "_id" : "products/7159077555",
    "_rev" : "7159077555",
    "_key" : "7159077555",
    "productId" : 1003,
    "category1" : 3,
    "category2" : 2,
    "attribute1" : 2,
    "attribute2" : 0,
    "name" : "Lore Ipsum 1003"
  },
  {
    "_id" : "products/7159274163",
    "_rev" : "7159274163",
    "_key" : "7159274163",
    "productId" : 1004,
    "category1" : 4,
    "category2" : 3,
    "attribute1" : 3,
    "attribute2" : 1,
    "name" : "Lore Ipsum 1004"
  },
  {
    "_id" : "products/7161633459",
    "_rev" : "7161633459",
    "_key" : "7161633459",
    "productId" : 1016,
    "category1" : 1,
    "category2" : 1,
    "attribute1" : 2,
    "attribute2" : 13,
    "name" : "Lore Ipsum 1016"
  }
]

or if you are only interested in the product identifies 或者如果您只对产品标识感兴趣

> db._query("FOR p IN products FILTER p.attribute1 >= 2 && p.attribute1 <= 3 SORT p.name LIMIT 3 RETURN p.productId").toArray();
[
  1003,
  1004,
  1016
]

Now to get the facets say for category1 现在为了获得类别1的方面

>  db._query("LET l = (FOR p IN products FILTER p.attribute1 >= 2 && p.attribute1 <= 3 SORT p.name RETURN p) return [ slice(l,@skip,@count), (FOR p in l collect c1 = p.category1 INTO g return { category1: c1, count: length(g[*].p)}) ]", { skip: 0, count: 3 }).toArray()
[
  [
    [
      {
        "_id" : "products/7159077555",
        "_rev" : "7159077555",
        "_key" : "7159077555",
        "productId" : 1003,
        "category1" : 3,
        "category2" : 2,
        "attribute1" : 2,
        "attribute2" : 0,
        "name" : "Lore Ipsum 1003"
      },
      {
        "_id" : "products/7159274163",
        "_rev" : "7159274163",
        "_key" : "7159274163",
        "productId" : 1004,
        "category1" : 4,
        "category2" : 3,
        "attribute1" : 3,
        "attribute2" : 1,
        "name" : "Lore Ipsum 1004"
      },
      {
        "_id" : "products/7161633459",
        "_rev" : "7161633459",
        "_key" : "7161633459",
        "productId" : 1016,
        "category1" : 1,
        "category2" : 1,
        "attribute1" : 2,
        "attribute2" : 13,
        "name" : "Lore Ipsum 1016"
      }
    ],
    [
      {
        "category1" : 0,
        "count" : 307
      },
      {
        "category1" : 1,
        "count" : 308
      },
      {
        "category1" : 2,
        "count" : 308
      },
      {
        "category1" : 3,
        "count" : 308
      },
      {
        "category1" : 4,
        "count" : 308
      }
    ]
  ]
]

To drill down to category1 and use the facets for category2: 要深入到category1并使用facet进行类别2:

>  db._query("LET l = (FOR p IN products FILTER p.attribute1 >= 2 && p.attribute1 <= 3 && p.category1 == 1 SORT p.name RETURN p) return [ slice(l,@skip,@count), (FOR p in l collect c2 = p.category2 INTO g return { category2: c2, count: length(g[*].p)}) ]", { skip: 0, count: 3 }).toArray()
[
  [
    [
      {
        "_id" : "products/7161633459",
        "_rev" : "7161633459",
        "_key" : "7161633459",
        "productId" : 1016,
        "category1" : 1,
        "category2" : 1,
        "attribute1" : 2,
        "attribute2" : 13,
        "name" : "Lore Ipsum 1016"
      },
      {
        "_id" : "products/7169497779",
        "_rev" : "7169497779",
        "_key" : "7169497779",
        "productId" : 1056,
        "category1" : 1,
        "category2" : 6,
        "attribute1" : 3,
        "attribute2" : 2,
        "name" : "Lore Ipsum 1056"
      },
      {
        "_id" : "products/6982720179",
        "_rev" : "6982720179",
        "_key" : "6982720179",
        "productId" : 106,
        "category1" : 1,
        "category2" : 1,
        "attribute1" : 2,
        "attribute2" : 4,
        "name" : "Lore Ipsum 106"
      }
    ],
    [
      {
        "category2" : 0,
        "count" : 44
      },
      {
        "category2" : 1,
        "count" : 44
      },
      {
        "category2" : 2,
        "count" : 44
      },
      {
        "category2" : 3,
        "count" : 44
      },
      {
        "category2" : 4,
        "count" : 44
      },
      {
        "category2" : 5,
        "count" : 44
      },
      {
        "category2" : 6,
        "count" : 44
      }
    ]
  ]
]

In order to make that search string more user friendly, it be necessary to write some small helper functions in Javascript. 为了使搜索字符串更加用户友好,有必要在Javascript中编写一些小帮助函数。 I think the support group https://groups.google.com/forum/#!forum/arangodb would be they right place to discuss your requirements. 我认为支持小组https://groups.google.com/forum/#!forum/arangodb是讨论您的要求的正确位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM