如何在多值Solr索引属性中搜索多个值

2020-08-22 18:06发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在SOLR中,索引已在基础产品上完成。 在其他产品上,忠诚度积分得到管理。

创建了一个SOLR索引属性 pointsRequiredToPurchase ,该属性具有多值,可以容纳整数。 索引后,它具有如下值:

" pointsRequiredToPurchase_int_mv":[100,550]

在SOLR仪表板中,如果我执行查询 pointsRequiredToPurchase_int_mv:[500 TO *],我正在得到结果。

现在,当我通过SearchFilterQueryData传递此值时,它没有任何结果。

受保护的void setPointsFilter(List  listSearchFilterQueryData,整数点){
 StringBuffer sb = new StringBuffer();
 sb.append(" [")。append(points).append(" TO *]");
 字符串pointsRange = sb.toString();
//奖励目录合格产品的条件
 SearchFilterQueryData catalogEligibleQueryData = new SearchFilterQueryData();
 catalogEligibleQueryData.setKey(" pointsRequiredToPurchase");
 catalogEligibleQueryData.setOperator(FilterQueryOperator.AND);
 Set  valueSet =新的HashSet <>();
 valueSet.add(pointsRange);
 catalogEligibleQueryData.setValues(valueSet);
 listSearchFilterQueryData.add(catalogEligibleQueryData);
 }
 

随附的代码段。 添加此过滤器后,我没有任何结果。

在后处理器中,我可以看到如下查询:

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

你能告诉我我做错什么了吗?

谢谢

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在SOLR中,索引已在基础产品上完成。 在其他产品上,忠诚度积分得到管理。

创建了一个SOLR索引属性 pointsRequiredToPurchase ,该属性具有多值,可以容纳整数。 索引后,它具有如下值:

" pointsRequiredToPurchase_int_mv":[100,550]

在SOLR仪表板中,如果我执行查询 pointsRequiredToPurchase_int_mv:[500 TO *],我正在得到结果。

现在,当我通过SearchFilterQueryData传递此值时,它没有任何结果。

受保护的void setPointsFilter(List  listSearchFilterQueryData,整数点){
 StringBuffer sb = new StringBuffer();
 sb.append(" [")。append(points).append(" TO *]");
 字符串pointsRange = sb.toString();
//奖励目录合格产品的条件
 SearchFilterQueryData catalogEligibleQueryData = new SearchFilterQueryData();
 catalogEligibleQueryData.setKey(" pointsRequiredToPurchase");
 catalogEligibleQueryData.setOperator(FilterQueryOperator.AND);
 Set  valueSet =新的HashSet <>();
 valueSet.add(pointsRange);
 catalogEligibleQueryData.setValues(valueSet);
 listSearchFilterQueryData.add(catalogEligibleQueryData);
 }
 

随附的代码段。 添加此过滤器后,我没有任何结果。

在后处理器中,我可以看到如下查询:

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

你能告诉我我做错什么了吗?

谢谢

付费偷看设置
发送
4条回答
xfwsx85
1楼-- · 2020-08-22 18:44

我可以在最终查询中看到其他过滤器,例如isRewardCatalogEligible_boolean,inStockFlag_boolean。 要交叉验证结果,请在SOLR仪表板上执行完整过滤器查询,然后查看是否得到任何结果。

如果没有,则编辑查询以查看哪个字段得出零结果。

Nir深蓝
2楼-- · 2020-08-22 18:45

如果我执行查询isRewardCatalogEligible_boolean:true AND inStockFlag_boolean:true AND pointsRequiredToPurchase_int_mv:[500 SOLr信息中心中的TO *]。

虽然我没有在ProductSearchPageData中获得结果,但我认为这是由于内部添加了" \"和" +"字符所致。

有什么主意吗?

微wx笑
3楼-- · 2020-08-22 18:42

这里有任何帮助。.如何代替+应用到

CJones
4楼-- · 2020-08-22 18:29

嗨, Manish Yadav

我可以看到您已自定义查询,Hybris OOTB功能通过以下util类对特殊字符进行了转义:

 ClientUtils.escapeQueryChars(convertedField)

有两种方法可以解决pointsRequiredToPurchase_int_mv的问题:\ [500 \ + TO \ + \ * \]

解决方案1:

  • 有一类FacetSearchQueryFilterQueriesPopulator扩展了AbstractFacetSearchQueryPopulator
  • 您必须重写方法addQueryFieldQueries,在其中可以删除这些特殊字符。 请在下面找到xml映射和新实现:
公共类CustomFacetSearchQueryFilterQueriesPopulator扩展了AbstractFacetSearchQueryPopulator
 {

 受保护的void addQueryFieldQueries(最终SearchQuery searchQuery,最终List 查询)
 {
 最终迭代器var4 = searchQuery.getFilterQueries()。iterator();


 而(var4.hasNext())
 {
 最终QueryField filterQuery =(QueryField)var4.next();
 字符串查询= 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);
 }

 }
 query.add(查询);
 }
 }

 }


 
 
 
 <列表>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 

解决方案2:覆盖DefaultFacetSearchStrategy并重写search method()并将条件直接添加到SolrQuery对象中。

请参见以下示例代码段:

公共类CustomFacetSearchStrategy扩展AbstractFacetSearchStrategy
 {


 @Override
 公共SearchResult搜索(最终SearchQuery searchQuery,最终Map  searchHints)抛出FacetSearchException
 {
//现有代码
 solrQuery.addFilterQuery(" pointsRequiredToPurchase_int_mv:[500 TO *]");
//现有代码

 }
 }
 

这些解决方案正在工作,并且肯定会为您提供帮助。 假设您使用的是SAP Commerce 6.7或更高版本。 让我知道是否有帮助

一周热门 更多>