材料代码中的Solr精确匹配搜索问题包含特殊字符

2020-09-07 10:33发布

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

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


专家们,

我们有一个要求,如果"用户"使用确切的物料编号搜索,则"用户"将被重定向到该物料的PDP页面。

说明:Hybris将使用以下过滤器检查是否完全匹配:-->忽略大小写(例如搜索材料编号字母的大写或小写)->删除任何特殊字符,例如连字符'-', 下划线'_',磅'#',括号'('和')',正斜杠'/',句点'。

用例:1.材料代码可以是数字或字母数字,带有或不带有特殊字符。 (例如FW35X600XL02,FW35-7002E3L65,ZF-HFW35C812XL80)2.物料代码可以在另一个物料代码中作为子字符串出现。 (例如FW35-8011,FW35-8011T1)3.物料代码可以在物料名称中显示为子字符串。

请提供有关如何实现此目标的建议。

感谢Murali

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

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


专家们,

我们有一个要求,如果"用户"使用确切的物料编号搜索,则"用户"将被重定向到该物料的PDP页面。

说明:Hybris将使用以下过滤器检查是否完全匹配:-->忽略大小写(例如搜索材料编号字母的大写或小写)->删除任何特殊字符,例如连字符'-', 下划线'_',磅'#',括号'('和')',正斜杠'/',句点'。

用例:1.材料代码可以是数字或字母数字,带有或不带有特殊字符。 (例如FW35X600XL02,FW35-7002E3L65,ZF-HFW35C812XL80)2.物料代码可以在另一个物料代码中作为子字符串出现。 (例如FW35-8011,FW35-8011T1)3.物料代码可以在物料名称中显示为子字符串。

请提供有关如何实现此目标的建议。

感谢Murali

付费偷看设置
发送
6条回答
代楠1984
1楼-- · 2020-09-07 11:09

嗨,

一个有趣的问题,但是我只能分享一些想法,但是不确定哪个是最好的。 1)这是一个非常普遍的要求,在过去的项目中,我们实际上是将逻辑插入Search Controller中。 用户提供了术语后,我们实际上在数据库中而不是在Solr中搜索了此完全匹配项。 只有在没有确切的马赫数时,我们才在Solr中进行标准搜索。

此方法的原因:实现起来容易且快速+通常效果良好在您的情况下,区别在于小写和特殊字符处理。 为此,您可能已经创建了拦截器-每次将产品保存到DB中时,都将剥离特殊字符并将此简化版本保存在其他字段中。 这样会减慢产品的创建和修改速度,但会导致对数据库的查询非常快。

如果要使用Solr解决方案,我会考虑两种解决方案:

2)使该字段成为一个构面-在建立索引并传递构面时-您将进行精确搜索

3)使用文本搜索功能,但使用一个特殊字段(这意味着要进行一些自定义,以便对完全匹配和不存在完全匹配的标准搜索执行不同的搜索)。 Solr中的此字段需要不同的内容-使用Tokenizer只会创建一个令牌(用于完全匹配)和一些过滤器以删除特殊字符并使用小写字母。

这是一个高级答案,如果您要进行数据库搜索(这是我的建议),那么就足够了。 如果您决定采用Solr方法,我可以为您提供更多详细信息,但是您将需要自己做很多编码和研究,因为这更加复杂。

愤怒的猪头君
2楼-- · 2020-09-07 10:52

嗨,谢谢您的建议。

实际上,除了产品代码外,我们还有两个类似于产品代码的字段(客户特定的物料编号和序列号,与产品保持关联)。 因此,按照第一种方法,即数据库一,这就是我要做的:

  1. 将创建一个自定义的灵活搜索查询,该查询将在用户输入与三个字段(代码,customerMaterialCode,customerSerialCode)进行比较之后,通过对相同的模式执行JOIN来搜索完全匹配。

  2. 如果搜索查询返回任何结果,则将用户重定向到PDP,否则让Solr执行标准搜索。

现在我的问题是,它将对性能产生任何影响,因为我将要创建一个灵活的搜索查询,该查询将通过在三个模式上执行JOIN来搜索结果?

此外,能否请您提供有关第三种方法的更多详细信息。

感谢Murali

My梦
3楼-- · 2020-09-07 10:53

嗨,这可以通过在SOLR模式中添加自定义字段类型来解决。 在架构中创建自定义字段类型,如下所示:1.对于区分大小写->使用LowercaseFilter 2.对于删除特殊字符,请使用仅启用concateAll选项的WordDelimiterFilter。 3.将该字段类型分配给物料代码。

示例字段类型:

  

  

这将通过删除特殊字符并在索引时间和查询时间将其转换为小写字母来生成令牌,以使其匹配。

希望这会对您有所帮助。

谢谢

CJones
4楼-- · 2020-09-07 11:10

您好,我们拥有的完整方案是,我们允许用户根据以下四个字段进行全局搜索:产品代码,CustomerMaterialNumber,CustomerSerailNumber,产品名称。

如果用户输入字符串与三个(产品代码,CustomerMaterialNumber,CustomerSerailNumber)中的任何一个完全匹配,那么我们会将用户重定向到PDP,否则必须在PLP上显示所有搜索结果。

此外,没有特定于客户的代码限制,客户可以搜索任何产品代码,customerMaterialCode customerSerialCode,即,如果我是Customer 2并且搜索AA-1,那么我可以找到上面的产品。

关于Solr中的解决方案,在上述注释中,在这种情况下,我们还必须进行两次查询以进行Solr,是吗? 如果是这样,那么我将如何告诉solr首先在定义为自定义字段类型的字段的基础上进行搜索查询,如果没有结果,则进行标准solr搜索查询? 您能否提供更多有关此的详细信息。

此外,在您的第一条评论中,您提到了一种solr方法,在该方法中我们需要进行大量定制,您能否也提供有关此方法的更多详细信息。

SAP小菜
5楼-- · 2020-09-07 11:00

嗨,

是的,您所描述的有关数据库解决方案的方法就是我的意思。 关于JOIN的性能-这应该不是一个大问题,它取决于数据量,但最后它是DB的标准操作。

您可以考虑为搜索中使用的字段创建数据库索引。

关于Solr中的解决方案,在上面的注释中,高层描述了应该如何在Solr中设置字段-这将是仅用于代码,customerMaterialCode和customerSerialCode的特殊字段。

然后的解决方案与使用DB的解决方案相似,但是如果您不执行标准Solr查询,则找到的答案将重定向到产品详细信息页面,而不是仅在此字段中在Solr中搜索。

要区分精确代码搜索查询和第二次查询,您可以使用此处描述的潜在概念: https://help.sap.com/viewer/9d346683b0084da2938be8a285c0c27a/1808/zh-CN/cac34797e1d0460c9966adbbb3be78ol

根据上下文,您可以用不同的方式定义搜索。

不过,根据您的回答还有一点。 我是否正确(每个客户的customerMaterialCode和customerSerialCode不同)? 最终可能会得到大量数据。...通过这种完全匹配,客户可以搜索产品代码,以及:属于他的customerMaterialCode customerSerialCode吗?

示例:

产品A:

代码AA

客户1 的

customerMaterialCode AA-1 客户2

的customerMaterialCode AA-2 客户1 的

customerSerialCode AA-1 客户2

的customerSerialCode AA-2

如果我是 Customer 2 ,我搜索 AA-1 ,是否找到上面的产品,因为为 AA-1 定义了值 仅客户1 ?

小c菟菟
6楼-- · 2020-09-07 10:56

嗨,

如果您只想使用solr,则可以尝试在solr属性中添加三个新字段,每个字段都与您要完全匹配的属性相对应,并将字段类型指定为" sortabletext(KeywordTokenizer不会实际进行标记化,因此整个 输入字符串将保留为单个标记)",并为这些字段提供比其他字段最高的提升,一旦获得搜索结果,您的生活就会变得简单,只需将经过清理的输入文本与必填字段进行比较,如果匹配则为Diwali :)

一周热门 更多>