4

我在用 PHP 构建的社区电子商务中使用 Neo4j 并使用 REST 接口。

我需要获取与亚马逊等搜索结果相关的所有类别。此功能在其他引擎中可用,例如 Solr(Lucene 的另一种实现)作为Faceted Search

如何在 Neo4j 中进行分面搜索?或重新创建此功能的最佳方式(性能等级)是什么?

neo4j 的核心包中排除了与此功能相关的所有必需模块。我想知道是否有人尝试在不横向所有节点的情况下做这样的事情,获取一些属性,并对这些值进行 groupCount。如果我们有 200k 个节点,则横向需要 10 秒才能获得类别。

这是我的 Gremlin 方法。

(new Neo4jVertexSequence(
    g.getRawGraph().index().forNodes('products').query(
        new org.neo4j.index.lucene.QueryContext('category:?')
    ), g
))._().groupBy{it.category}.cap.next();

结果为 90 行,耗时 54 秒。

Books = 12002
Movies_Music_Games = 19233
Electronics_Computers = 60540
Home_Garden_Tools = 9123
Grocery_Health_Beauty = 15643
Toys_Kids_Baby = 15099
Clothing_Shoes_Jewelry = 12543
Sports_Outdoors = 10342
Automotive_Industrial = 9638
... (more rows)

当然,我不能把这个结果放在缓存中,因为这是“非输入搜索”。如果用户进行像“Iphone”这样的查询,查询看起来像

(new Neo4jVertexSequence(
    g.getRawGraph().index().forNodes('products').query(
        new org.neo4j.index.lucene.QueryContext('search:"iphone" AND category:?')
    ), g
))._().groupBy{it.category}.cap.next();
4

1 回答 1

0

你的领域模型呢?你把所有东西都放在索引里了吗?通常,您会将您的类别建模为节点,并将您的产品与类别节点相关联。

(product)-[:HAS_CATEGORY]->(category)<-[:IS_CATEGORY]-(categories)

在您的查询中,您只需遍历这棵小树并从每个类别节点开始计算 :HAS_CATEGORY 类型的关系。

start categories=node(x)
match (product)-[:HAS_CATEGORY]->(category)<-[:IS_CATEGORY]-(categories)
return category.name, count(*)
于 2012-10-28T03:14:35.917 回答