2014-03-13 30 views
4

有沒有人知道ArangoDB是否支持分面搜索,以及性能如何與支持它的其他產品(例如Solr,MarkLogic)或沒有的產品(例如Mongo)相比?ArangoDB是否有多面搜索?

在搜索站點,閱讀文檔和搜索Google小組後,我沒有看到它在任何地方討論過。

感謝

回答

10

ArangoDB有一個查詢語言,它支持組由類的查詢。這使您可以實施分面搜索。爲了確定我們對於多面搜索有相同的理解,請讓我解釋一下,我認爲它的意思。你有 - 例如 - 產品清單。每種產品都有一些屬性(例如名稱,型號)和一些類別(例如製造商)。然後我可以搜索一個包含單詞的名稱或名稱。這將列出所有產品以及顯示有多少產品屬於哪個類別。這是你的意思嗎?

所以對於例子:假設你有哪些有三個屬性(名稱,ATTRIBUTE1,attribute2)和兩個類別(類別1,類別2)文件:

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

這樣一個典型的文檔是:

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

如果你想搜索已2和3(含)之間的ATTRIBUTE1的所有文件,可以使用

> 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" 
    } 
] 

,或者如果你只對產品有興趣的標識

> 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 
] 

我們拿到方面說的組別

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

向下鑽取到類別1和使用方面的組別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 
     } 
    ] 
    ] 
] 

爲了使該搜索字符串更加用戶友好,有必要在Javascript中編寫一些小的幫助函數。我認爲支持組https://groups.google.com/forum/#!forum/arangodb將是他們討論您的要求的正確地方。

+1

感謝您的詳細解答。 – user2029783