如何在Broadleaf REST中进行过滤和排序?

时间:2015-10-12 11:20:50

标签: broadleaf-commerce

在阔叶中,使用solr进行搜索。我能够正确搜索。我开始知道过滤和排序也是由solr完成的,所以我想知道如何实现这两者?

我发现使用过滤和排序搜索方面,我已经执行了以下几行:

INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, FACET_FIELD_TYPE) VALUES (1, 'PRODUCT', 'manufacturer', 'mfg', TRUE, 's');
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, FACET_FIELD_TYPE) VALUES (2, 'PRODUCT', 'defaultSku.retailPrice', 'price', FALSE, 'p');
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, TRANSLATABLE, FACET_FIELD_TYPE) VALUES (3, 'PRODUCT', 'defaultSku.name', 'name', TRUE, TRUE, 's');
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, FACET_FIELD_TYPE) VALUES (4, 'PRODUCT', 'model', 'model', TRUE, 's');
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, TRANSLATABLE) VALUES (5, 'PRODUCT', 'defaultSku.description', 'desc', TRUE, TRUE);
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, TRANSLATABLE) VALUES (6, 'PRODUCT', 'defaultSku.longDescription', 'ldesc', TRUE, TRUE);
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, FACET_FIELD_TYPE) VALUES (7, 'PRODUCT', 'defaultCategory.name', 'categoryName', TRUE, 's');

INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (1, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (2, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (3, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (4, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (5, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (6, 't');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (7, 't');

INSERT INTO BLC_SEARCH_FACET (SEARCH_FACET_ID, FIELD_ID, LABEL, SHOW_ON_SEARCH, MULTISELECT, SEARCH_DISPLAY_PRIORITY) VALUES (1, 1, 'Manufacturer', FALSE, TRUE, 1);
INSERT INTO BLC_SEARCH_FACET (SEARCH_FACET_ID, FIELD_ID, LABEL, SHOW_ON_SEARCH, MULTISELECT, SEARCH_DISPLAY_PRIORITY) VALUES (2, 2, 'Price', FALSE, TRUE, 1);
INSERT INTO BLC_SEARCH_FACET (SEARCH_FACET_ID, FIELD_ID, LABEL, SHOW_ON_SEARCH, MULTISELECT, SEARCH_DISPLAY_PRIORITY) VALUES (3, 7, 'categoryName', FALSE, TRUE, 1);

对于过滤,我可以使用?q = *& price = range [0:100]对价格进行过滤。我想知道如何过滤制造商或categoryName?我在数据库中添加了与两者的价格相同的条目,但我无法过滤制造商或类别名称。

用于分类, 我在名为“ProductSearchCriteria”的类中找到了“sortQuery”字段,但我不知道如何在查询字符串中使用sort。 我试过?q = *& sort = price + asc并在CatalogEndpoint.java中设置sortQuery,

searchCriteria.setSortQuery(sort);

然后调用方法,

result = getSearchService().findProductsByQuery(q, searchCriteria, sort);

但它不起作用。请帮助。

2 个答案:

答案 0 :(得分:1)

如果您仍然坚持添加更多可能有用的过滤器。

要添加新过滤器,您需要在数据库中创建几个条目,如下所示:

  1. 在BLC_SEARCH_FACET表格中为新字段(例如尺寸)添加条目:
  2. INSERT INTO BLC_SEARCH_FACET (SEARCH_FACET_ID, FIELD_ID, LABEL,  SHOW_ON_SEARCH, MULTISELECT, SEARCH_DISPLAY_PRIORITY) VALUES (5, 9, 'size', TRUE, TRUE, 1);
    1. 插入表BLC_CAT_SEARCH_FACET_XREF以将该字段与类别相关联:
    2. INSERT INTO BLC_CAT_SEARCH_FACET_XREF (CATEGORY_SEARCH_FACET_ID, CATEGORY_ID, SEARCH_FACET_ID, SEQUENCE) VALUES (10, 10050, 5, 9);
      INSERT INTO BLC_CAT_SEARCH_FACET_XREF (CATEGORY_SEARCH_FACET_ID, CATEGORY_ID, SEARCH_FACET_ID, SEQUENCE) VALUES (11, 10054, 5, 9);
      INSERT INTO BLC_CAT_SEARCH_FACET_XREF (CATEGORY_SEARCH_FACET_ID, CATEGORY_ID, SEARCH_FACET_ID, SEQUENCE) VALUES (12, 10055, 5, 9);
      INSERT INTO BLC_CAT_SEARCH_FACET_XREF (CATEGORY_SEARCH_FACET_ID, CATEGORY_ID, SEARCH_FACET_ID, SEQUENCE) VALUES (13, 10056, 5, 9);
      
      1. 插入表BLC_SEARCH_FACET_RANGE以指定新字段的范围:
      2. INSERT INTO BLC_SEARCH_FACET_RANGE (SEARCH_FACET_RANGE_ID, SEARCH_FACET_ID, MIN_VALUE, MAX_VALUE) VALUES (5, 5, 0, 5);
        INSERT INTO BLC_SEARCH_FACET_RANGE (SEARCH_FACET_RANGE_ID, SEARCH_FACET_ID, MIN_VALUE, MAX_VALUE) VALUES (6, 5, 5, 10);
        INSERT INTO BLC_SEARCH_FACET_RANGE (SEARCH_FACET_RANGE_ID, SEARCH_FACET_ID, MIN_VALUE, MAX_VALUE) VALUES (7, 5, 10, 15);
        INSERT INTO BLC_SEARCH_FACET_RANGE (SEARCH_FACET_RANGE_ID, SEARCH_FACET_ID, MIN_VALUE, MAX_VALUE) VALUES (8, 5, 15, null);

        完成此操作后,为了将此过滤器包含在产品中,您需要指定产品属性" size" &安培;在定义新产品时,它在高级设置选项卡中的值。 而且,您现在可以在左侧面板中看到尺寸过滤器了。

答案 1 :(得分:0)

我已经弄清楚如何在阔叶中启用排序。

考虑 CatalagEndpoint.java 中的方法findProductsByQuery()。添加一个名为sort的查询参数,如@QueryParam("sort") String sort。现在在searchCriteria中设置排序。

searchCriteria.setSortQuery(sort);

现在调用result = getSearchService().findProductsByQuery(q, searchCriteria);时,它将执行 SolrSearchServiceImpl.java 的方法findProductsByQuery()。这将返回findProducts(query, facets, searchCriteria, null)。注意,这里defaultSort设置为null。 要启用排序,请更改

result = getSearchService().findProductsByQuery(q, searchCriteria);

result = getSearchService()。findProductsByQuery(q,searchCriteria,sort);

CatalogEndpoint.java 中的

。这会将排序查询字符串传递给 SolrSearchServiceImpl.java 的方法findProductsByQuery()

现在更改SolrSearchServiceImpl.java,将sort参数添加到方法findProductsByQuery()中。该方法如下所示:

@Override
public ProductSearchResult findProductsByQuery(String query, ProductSearchCriteria searchCriteria, String sort) throws ServiceException {
    List<SearchFacetDTO> facets = getSearchFacets();
    query = "(" + sanitizeQuery(query) + ")";
    return findProducts(query, facets, searchCriteria, sort);
}

此外,您还必须在接口SearchService中添加sort,

public ProductSearchResult findProductsByQuery(String query, ProductSearchCriteria searchCriteria, String sort) throws ServiceException;

在方法findProducts()中添加sort参数,该方法如下所示:

@Deprecated
protected ProductSearchResult findProducts(String qualifiedSolrQuery, List<SearchFacetDTO> facets, ProductSearchCriteria searchCriteria, String defaultSort) throws ServiceException {
    return findProducts(qualifiedSolrQuery, facets, searchCriteria, defaultSort, null);
}

更改后,排序查询字符串作为defaultSort发送,solr查询基于defaultSort生成。

现在在findProduct()方法中,调用了一个方法,

attachSortClause(solrQuery, searchCriteria, defaultSort);

这种方法的实施情况如下:

protected void attachSortClause(SolrQuery query, ProductSearchCriteria searchCriteria, String defaultSort) {
    Map<String, String> solrFieldKeyMap = getSolrFieldKeyMap(searchCriteria);

    String sortQuery = searchCriteria.getSortQuery();
    if (StringUtils.isBlank(sortQuery)) {
            sortQuery = defaultSort;
    }

    if (StringUtils.isNotBlank(sortQuery)) {
            String[] sortFields = sortQuery.split(",");
            for (String sortField : sortFields) {
                String field = sortField.split(" ")[0];
                if (solrFieldKeyMap.containsKey(field)) {
                        field = solrFieldKeyMap.get(field);
                }
                ORDER order = "desc".equals(sortField.split(" ")[1]) ? ORDER.desc : ORDER.asc;

                if (field != null) {
                        query.addSortField(field, order);
                }
            }
    }
}

这是将sortClauses设置为null,用于设置sortClauses,将上面的实现更改为:

protected void attachSortClause(SolrQuery query, ProductSearchCriteria searchCriteria, String defaultSort) {
    Map<String, String> solrFieldKeyMap = getSolrFieldKeyMap(searchCriteria);

    String sortQuery = searchCriteria.getSortQuery();
    if (StringUtils.isBlank(sortQuery)) {
        sortQuery = defaultSort;
    }

    if (StringUtils.isNotBlank(sortQuery)) {
        String[] sortFields = sortQuery.split(",");
        for (String sortField : sortFields) {
            String field = sortField.split(" ")[0];
            if (solrFieldKeyMap.containsKey(field)) {
                field = solrFieldKeyMap.get(field);
            }
            ORDER order = "desc".equals(sortField.split(" ")[1]) ? ORDER.desc : ORDER.asc;

            if (field != null) {
                query.addSortField(field, order);
                List<SortClause> sortClauses = new ArrayList<SortClause>();
                SortClause clause = SortClause.create(field, order);
                sortClauses.add(clause);
                query.setSorts(sortClauses);
            }
        }
    }
}

这将根据查询字符串中传递的排序查询设置sortClause。

现在,当您通过?q=*&sort=price+asc时,它会返回json有价格上涨的产品。

如果你想看看solr如何创建索引和排序,请在网站的log4j.xml中添加以下行。

<logger name="org.broadleafcommerce.core.search.service"> <level value="trace" /> </logger>

当您的服务器启动时,solr会创建所有索引,并且在 log4j.xml 中放入以上行后,索引会显示为日志。

当您请求catalog/search/products?q=*&sort=price+asc时,它会根据价格跟踪productIds。您可以在控制台中看到产品按升序价格排序。

[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10461}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10441}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10204}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10244}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10284}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10283}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10243}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10248}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10246}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10247}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10416}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10359}
[TRACE] 11:29:01 SolrSearchServiceImpl - SolrDocument{productId=10433}

在JSON中,您将根据以上跟踪的productIds的订单获得产品。