on 2020 Mar 03 10:49 AM
Hi,
In SOLR indexing has been done on base products. On variant products loyalty points are managed.
Created one SOLR indexed property pointsRequiredToPurchase which is multi valued that can hold integer. After indexing it hold value like:
"pointsRequiredToPurchase_int_mv":[100, 550]
In SOLR dashboard, if i execute query pointsRequiredToPurchase_int_mv:[500 TO *], I am getting results.
Now, when i am passing this value via SearchFilterQueryData, it gives me no result.
protected void setPointsFilter(List<SearchFilterQueryData> listSearchFilterQueryData, int points) {
StringBuffer sb = new StringBuffer();
sb.append("[").append(points).append(" TO *]");
String pointsRange = sb.toString();
// Condition for reward catalog eligible product
SearchFilterQueryData catalogEligibleQueryData = new SearchFilterQueryData();
catalogEligibleQueryData.setKey("pointsRequiredToPurchase");
catalogEligibleQueryData.setOperator(FilterQueryOperator.AND);
Set<String> valueSet = new HashSet<>();
valueSet.add(pointsRange);
catalogEligibleQueryData.setValues(valueSet);
listSearchFilterQueryData.add(catalogEligibleQueryData);
}
Attached is the code snippet. After adding this filter i am getting no result.
In Post Processor i could see query like below:
yq=*:*&q={!boost}(%2B{!lucene+v%3D$yq})&fq=isRewardCatalogEligible_boolean:true&fq=inStockFlag_boolean:true&fq=pointsRequiredToPurchase_int_mv:\[500\+TO\+\*\]&sort=mostSoldAllTime_int+desc☆t=0&rows=20
Could you tell me if i am doing something wrong.
Thanks
Request clarification before answering.
Hi mani20
I can see that you have customized your query and special character are escaped by Hybris OOTB functionality by below util class:
ClientUtils.escapeQueryChars(convertedField)There are two way to fix this issue for pointsRequiredToPurchase_int_mv:\[500\+TO\+\*\]
Solution 1:
public class CustomFacetSearchQueryFilterQueriesPopulator extends AbstractFacetSearchQueryPopulator
{
protected void addQueryFieldQueries(final SearchQuery searchQuery, final List<String> queries)
{
final Iterator var4 = searchQuery.getFilterQueries().iterator();
while (var4.hasNext())
{
final QueryField filterQuery = (QueryField) var4.next();
String query = this.convertQueryField(searchQuery, filterQuery);
if(StringUtils.contains(query, "[") && StringUtils.isNotBlank(query))
{
if(StringUtils.contains(query, pointsRequiredToPurchase_int_mv))
{
query=StringUtils.replaceOnce(query, "\","");
query=StringUtils.replaceOnce(query, "+",SPACE);
}
}
queries.add(query);
}
}
}
<bean id="facetSearchQueryConverter" parent="abstractPopulatingConverter">
<property name="targetClass" value="org.apache.solr.client.solrj.SolrQuery" />
<property name="populators">
<list>
<ref bean="facetSearchQueryBasicPopulator" />
<ref bean="customFacetSearchQueryFilterQueriesPopulator" />
<ref bean="facetSearchQueryExcludedItemsFilterPopulator" />
<ref bean="facetSearchQueryCatalogVersionsFilterPopulator" />
<ref bean="facetSearchQueryGroupingPopulator" />
<ref bean="facetSearchQuerySortsPopulator" />
<ref bean="facetSearchQueryPagingPopulator" />
<ref bean="facetSearchQueryFacetsPopulator" />
<ref bean="facetSearchQueryFieldsPopulator" />
<ref bean="facetSearchQueryHighlightingFieldsPopulator" />
<ref bean="facetSearchQuerySpellcheckPopulator" />
<ref bean="facetSearchQueryParamsPopulator" />
</list>
</property>
</bean>
<bean id="customFacetSearchQueryFilterQueriesPopulator" class="com.custom.core.search.solrfacetsearch.search.impl.populators.CustomFacetSearchQueryFilterQueriesPopulator"
parent="abstractFacetSearchQueryPopulator" />
Solution 2: Ovevride DefaultFacetSearchStrategy and override search method() and add you condition in SolrQuery object directly.
See below sample snippet:
public class CustomFacetSearchStrategy extends AbstractFacetSearchStrategy
{
@Override
public SearchResult search(final SearchQuery searchQuery, final Map<String, String> searchHints) throws FacetSearchException
{
//existing code
solrQuery.addFilterQuery("pointsRequiredToPurchase_int_mv:[500 TO *] ");
//existing code
}
}
These solutions are working and definitely will help you. Assuming that you are using SAP Commerce 6.7 or higher. Let me know if it helps
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Any help here..How is + getting applied in place of <space>?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I can see other filters in final query such as isRewardCatalogEligible_boolean, inStockFlag_boolean . To cross verify the result , execute full filter query on SOLR dashboard and see whether you get any result .
If not , then edit the query to see which field is making zero result .
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I am getting the result if I execute query isRewardCatalogEligible_boolean:true AND inStockFlag_boolean:true AND pointsRequiredToPurchase_int_mv:[500 TO *] in solr dashboard.
I am not getting result in ProductSearchPageData though and i think it is due to "\" and "+" character added internally.
Any idea?
| User | Count |
|---|---|
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.