cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

How to search for more than one value in multi value solr indexed property

former_member686625
Participant
0 Kudos
2,525

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

Accepted Solutions (0)

Answers (3)

Answers (3)

a_e_dubey
Active Participant
0 Kudos

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:

  • There is one class FacetSearchQueryFilterQueriesPopulator extends AbstractFacetSearchQueryPopulator
  • You have to override method addQueryFieldQueries where you can remove these special character. Please find below xml mapping and new implementation:
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

former_member686625
Participant
0 Kudos

Any help here..How is + getting applied in place of <space>?

priti_mittal
Product and Topic Expert
Product and Topic Expert
0 Kudos

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 .

former_member686625
Participant
0 Kudos

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?