在阔叶中,使用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);
但它不起作用。请帮助。
答案 0 :(得分:1)
如果您仍然坚持添加更多可能有用的过滤器。
要添加新过滤器,您需要在数据库中创建几个条目,如下所示:
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);
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);
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的订单获得产品。