作者:来自 Elastic Andre Luiz
了解如何使用混合搜索来构建电子商务产品目录,使用分面、促销、个性化和行为分析。
在本文中,我们将演示如何实现将全文搜索的结果与向量搜索相结合的混合搜索。通过统一这两种方法,混合搜索可以扩大结果的广度,充分利用两种搜索策略的优势。
除了集成混合搜索之外,我们还将演示如何添加功能,使你的搜索解决方案更加强大。这些功能包括分面和个性化产品促销。此外,我们还将向你展示如何使用 Elastic 的行为分析工具捕获用户交互并生成有价值的见解。
在此实现中,你将了解如何构建允许用户查看和与搜索结果交互的界面以及负责返回信息的 API。要访问包含源代码的存储库,请通过以下链接访问:
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/product-store-search
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/app-product-store
我们将本指南分为几个步骤,从创建索引到实现高级功能(如分面和结果个性化)。最后,你将拥有一个强大的搜索解决方案,可用于电子商务场景。
环境设置
在开始实施之前,我们需要设置环境。你可以选择使用 Elastic Cloud 上的服务或容器化解决方案来管理 Elasticsearch。如果你选择容器化,则可以在此存储库中找到通过 Docker Compose 进行的配置:docker-compose.yml。
索引创建和产品目录提取
索引将基于化妆品目录创建,其中包括名称、描述、照片、类别和标签等字段。用于全文搜索的字段(如 “name” 和 “description”)将映射为 text,而用于聚合的字段(如 “category” 和 “brand”)将映射为 keyword 以启用分面/faceting。
“description” 字段将用于向量搜索,因为它提供了有关产品的更多上下文。此字段将被定义为 dense_vector,用于存储描述的向量表示。
索引映射如下:
{
"mappings":{
"properties":{
"id":{
"type":"keyword"
},
"brand":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
},
"name":{
"type":"text"
},
"price":{
"type":"float"
},
"price_sign":{
"type":"keyword"
},
"currency":{
"type":"keyword"
},
"image_link":{
"type":"keyword"
},
"description":{
"type":"text"
},
"description_embeddings":{
"type":"dense_vector",
"dims":384
},
"rating":{
"type":"keyword"
},
"category":{
"type":"keyword"
},
"product_type":{
"type":"keyword"
},
"tag_list":{
"type":"keyword"
}
}
}
}
创建索引的脚本可以在这里找到。
嵌入生成
为了对产品描述进行矢量化,我们使用模型 all-MiniLM-L6-v2。在这种情况下,应用程序负责在索引之前生成嵌入。另一种选择是将模型导入 Elasticsearch 集群,但对于这个本地环境,我们选择直接在应用程序内执行向量化。
我们使用 Kaggle 上提供的化妆品数据集来填充索引,为了提高数据提取的效率,我们使用了批处理。在同一个提取阶段,我们将为 “description” 字段生成嵌入,并将它们索引到新字段 “description_embeddings” 中。
完整的数据提取过程可以通过存储库中提供的 Jupyter Notebook 直接跟踪和执行。该笔记本提供了有关如何读取、处理和索引数据到 Elasticsearch 的分步指南,可轻松复制和实验。
你可以通过以下链接访问笔记本:Ingestion Notebook。
混合搜索实现
现在,让我们实现混合搜索。对于基于关键字的搜索,我们使用 multi_match 查询,针对字段 “name”、“category” 和 “description”。这可确保检索到包含这些字段中的任何一个中的搜索词的文档。
对于向量搜索,我们使用 KNN 查询。在执行查询之前,需要对搜索词进行向量化,这是使用对输入词进行向量化的方法完成的。请注意,在提取期间使用的相同模型也用于搜索词。
两种搜索的组合是使用倒数排序融合 ( Reciprocal Rank Fusion - RRF) 算法完成的,该算法合并了两个查询的结果并通过降低噪音来提高搜索准确性。RRF 允许基于关键字的搜索和向量搜索协同工作,从而增强对用户查询的理解。
query = {
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": organic_query['query']
}
},
{
"knn": {
"field": "description_embeddings",
"query_vector": vector,
"k": 5,
"num_candidates": 20
}
}
],
"rank_window_size": 20,
"rank_constant": 5
}
},
"_source": organic_query['_source']
}
比较结果:关键字搜索与混合搜索
现在,让我们比较一下传统关键字搜索与混合搜索的结果。使用关键字搜索 “foundation for dry skin - 干性皮肤粉底液” 时,我们得到以下结果:
- Revlon ColorStay Makeup for Normal / Dry SkinDescription:Revlon ColorStay 彩妆采用轻质配方,提供持久遮盖,不会结块、褪色或脱落。凭借缓释技术,这款无油、水分平衡配方专为中性或干性皮肤而设计,可持续提供水分。特点:妆感舒适,持妆时间长达 24 小时中度至完全覆盖有多种美丽色调可供选择/Revlon ColorStay Makeup for Normal / Dry SkinDescription: Revlon ColorStay Makeup provides longwearing coverage with a lightweight \nformula that won\u2019t cake, fade, or rub off. With Time Release \nTechnology, this oil-free, moisture-balance formula is especially \nformulated for normal or dry skin to continuously provide hydration.Features: Makeup feels comfortable and wears for up to 24 hours\nMedium to full coverage\nComes in a range of beautiful shades
- Maybelline Dream Smooth Mousse FoundationDescription:你会爱上它的原因独特的奶油状粉底液可提供 100% 婴儿般光滑的完美效果。皮肤看起来和感觉水润长达 14 小时 - 绝不粗糙或干燥轻盈配方提供完美的保湿覆盖效果无缝融合,全天感觉清新无油、无香料、经皮肤科医生测试、过敏测试、无粉刺性不会堵塞毛孔。敏感肌肤安全/Maybelline Dream Smooth Mousse FoundationDescription: Why You'll Love ItUnique cream-whipped foundation provides 100% baby-smooth perfection.\n\nSkin looks and feels hydrated for 14 hours - never rough or dry\nLightweight formula provides perfectly moisturizing coverage\nBlends seamlessly and feels fresh all-day\nOil-free, Fragrance-free, Dermatologist Tested, Allergy Tested, Non-comedogenic \u2013 won\u2019t clog pores.\nSafe for sensitive skin.
分析:搜索 “foundation for dry skin/干性皮肤粉底液” 时,搜索结果是通过搜索词关键字与产品标题和说明之间的精确匹配获得的。但是,这种匹配并不总是反映最佳选择。例如,Revlon ColorStay Makeup for Normal / Dry Skin 是一个不错的选择,因为它是专门为干性皮肤配制的。尽管它不含油,但其配方旨在提供持续的保湿。相比之下,我们还收到了Maybelline Dream Smooth Mousse Foundation/美宝莲梦幻柔滑慕斯粉底液,虽然不含油并提到保湿,但通常更推荐用于油性或混合性皮肤,因为无油产品往往侧重于控制油脂,而不是为干性皮肤提供所需的额外保湿。这凸显了基于关键字的搜索的局限性,它可能会返回不能完全满足干性皮肤人群特定需求的产品。
现在,使用混合方法执行相同搜索时:
- CoverGirl Outlast Stay Luminous Foundation Creamy Natural (820):Description/CoverGirl Outlast Stay Luminous Foundation 乳霜自然色 (820):描述:CoverGirl Outlast Stay Luminous Foundation 非常适合打造水润妆容和微妙的光泽。它不含油,采用不油腻的配方,让你的肌肤一整天都保持自然光泽!这款全天粉底液可滋润肌肤,同时提供完美遮瑕效果/CoverGirl Outlast Stay Luminous Foundation Creamy Natural (820):Description: CoverGirl Outlast Stay Luminous Foundation is perfect for achieving a dewy finish and a subtle glow. It is oil-free, with a non-greasy formula that gives your skin a natural luminosity that lasts all day! This all-day foundation hydrates skin while providing flawless coverage
- 分析:这款产品非常匹配,因为它强调保湿,这对干性皮肤的用户来说至关重要。术语 “hydrates skin/滋润肌肤” 和 “dewy finish/水润妆容” 与用户寻找干性皮肤粉底液的意图相符。向量搜索可能理解了保湿的概念,并将其与需要一款针对干性皮肤的粉底液联系起来。
- 露华浓 ColorStay 中性/干性皮肤粉底液:描述:露华浓 ColorStay 粉底液采用轻盈配方,提供持久遮瑕效果,不会结块、褪色或脱落。这款无油、水分平衡的配方采用缓释技术,专为中性或干性皮肤配制,可持续提供水分/Revlon ColorStay Makeup for Normal / Dry Skin:Description: Revlon ColorStay Makeup provides longwearing coverage with a lightweight formula that won’t cake, fade, or rub off. With Time Release Technology, this oil-free, moisture-balance formula is especially formulated for normal or dry skin to continuously provide hydration
- 分析:这款产品直接满足干性皮肤用户的需求,明确提到它是为中性或干性皮肤配制的。“moisture-balance formula” 和持续保湿非常适合寻找适合干性皮肤的粉底液的人。向量搜索成功检索到此结果,不仅是因为关键字匹配,还因为专注于保湿并特别提到干性皮肤是目标人群。
- Serum FoundationDescription:精华粉底液是轻盈的中等遮瑕配方,提供 21 种色调的全面色调范围。这些粉底液提供中等遮瑕力,看起来很自然,具有非常轻盈的精华感。它们的粘度非常低,可使用随附的泵或可选的玻璃滴管分配,如果需要,可以单独购买/ Serum FoundationDescription: Serum Foundations are lightweight medium-coverage formulations available in a comprehensive shade range across 21 shades. These foundations offer moderate coverage that looks natural with a very lightweight serum feel. They are very low in viscosity and are dispensed with the supplied pump or with the optional glass dropper available for purchase separately if preferred.
- 分析:在本例中,描述强调了轻盈、自然的精华粉底,这符合干性皮肤人群的需求,因为他们通常寻求温和、保湿且不结块的产品。向量搜索可能采用了更广泛的背景,即轻盈、自然的覆盖和精华液般的质地,这与保湿和舒适的使用相关,使其与干性皮肤相关,尽管没有明确提到 “dry skin” 一词。
Facet 实现
Facet 对于高效优化和筛选搜索结果至关重要,可为用户提供更有针对性的导航,尤其是在产品种类繁多的场景中,例如电子商务。它们允许用户根据类别、品牌或价格等属性调整结果,从而使搜索更加准确。为了实现此功能,我们在 category 和 brand 字段上使用术语聚合,这些字段在索引创建阶段被定义为 keyword。
query = build_query(term, categories, product_types, brands)
query["aggs"] = {
"product_types": {"terms": {"field": "product_type"}},
"categories": {"terms": {"field": "category"}},
"brands": {"terms": {"field": "brand.keyword"}}
}
完整的实现代码可在此处找到。
请参见以下搜索 “foundation for dry skin” 的方面结果:
自定义结果:固定查询 - pinned queries
在某些情况下,在搜索结果中推广某些产品可能会有所帮助。为此,我们使用固定查询,让特定产品出现在结果顶部。下面,我们将搜索术语 “Foundation”,但不推广任何产品:
在我们的示例中,我们可以推广带有 “Gluten Free/无麸质” 标签的产品。通过使用产品 ID,我们可以确保它们在搜索结果中优先显示。具体来说,我们将推广以下产品:Serum Foundation (ID:1043)、Coverage Foundation (ID:1042) 和 Realist Invisible Setting Powder (ID:1039)。
{
"query":{
"pinned":{
"ids":[
"1043",
"1042",
"1039"
],
"organic":{
"bool":{
"must":[
{
"multi_match":{
"query":"foundation",
"fields":[
"name",
"category",
"description"
]
}
}
]
}
}
}
}
}
我们使用特定的产品 ID 来确保它们在查询结果中优先显示。查询结构包括应 “固定 ”到顶部的产品 ID 列表(在本例中为 ID 1043、1042 和 1039),而其余结果则遵循搜索的有机流程,使用条件组合,例如字段 “name”、“category” 和 “description” 中的文本查询。这样,就可以以受控的方式推广商品,确保它们的可见性,同时保持其余搜索基于通常的相关性。
下面,你可以看到对推广产品执行查询的结果:
完整的查询代码可以在这里找到。
使用行为分析分析搜索行为
到目前为止,我们已经添加了功能来提高搜索结果的相关性并促进产品的可发现性。现在,我们将通过添加一项功能来完成我们的搜索解决方案,该功能将帮助我们分析用户的搜索行为,识别模式,例如有或没有结果的查询以及对搜索结果的点击。为此,我们将使用 Elastic 提供的行为分析功能。有了它,只需几个步骤,我们就可以监控和分析用户的搜索行为,获得有价值的见解以优化搜索体验。
创建行为分析集合
我们的第一个动作是创建一个集合,它将负责接收所有行为分析事件。要创建集合,请访问 Search > Behavioral Analytics 中的 Kibana 界面。在下面的示例中,我们创建了名为 tracking-search 的集合。
将行为分析集成到界面
我们的前端应用程序是用 JavaScript 开发的,为了集成行为分析,我们将按照官方 Elastic 文档中描述的步骤安装行为分析 JavaScript 跟踪器。
实现 JavaScript 跟踪器
现在,我们将跟踪器客户端导入到我们的应用程序中,并使用 trackPageView、trackSearch 和 trackSearchClick 方法来捕获用户交互。
免责声明:虽然我们使用工具来收集用户交互数据,但确保遵守 GDPR 至关重要。这意味着要清楚地告知用户正在收集哪些数据、如何使用这些数据,并提供退出跟踪的选项。此外,我们必须实施强有力的安全措施来保护收集到的信息并尊重用户权利,例如数据访问和删除,确保所有步骤都符合 GDPR 原则。
步骤 1:创建跟踪器实例
首先,我们将创建用于监控交互的跟踪器实例。在此配置中,我们定义目标端点、集合名称和 API 密钥:
createTracker({
endpoint: "https://endpoint:443",
collectionName: "tracking-search",
apiKey: "api-key"
});
第 2 步:捕获页面浏览量
要跟踪页面浏览量,我们可以配置 trackPageView 事件:
trackPageView({
page: {
title: "home-page"
},
});
有关 trackPageView 事件的更多详细信息,你可以参考此文档。
步骤 3:捕获搜索查询
为了监控用户的搜索操作,我们将使用 trackSearch 方法:
trackSearch({
search: {
query: searchTerm,
results: {
items: documents,
total_results: response.data.length,
},
},
});
这里我们收集搜索词和搜索结果。
步骤 4:跟踪搜索结果的点击次数
最后,为了捕获搜索结果的点击次数,我们将使用 trackSearchClick 方法:
trackSearchClick({
document: { id: product.id, index: "products-catalog"},
search: {
query: searchTerm,
page: {
current: 1,
size: products.length,
},
results: {
items: documents,
total_results: products.length,
},
search_application: "app-product-store"
},
});
我们收集有关点击的文档的 ID 以及搜索词和搜索结果的信息。
在 Kibana 中分析数据
现在,用户交互事件已被捕获,我们可以获得有关搜索操作的宝贵数据。Kibana 使用行为分析工具来可视化和分析这些行为数据。要查看结果,只需导航至 Search > Behavioral Analytics > My Collection,其中将显示已捕获事件的概览。
在此概述中,我们可以大致了解集成到我们界面中的每个操作所捕获的事件。通过这些信息,我们可以深入了解用户搜索行为。但是,如果你想创建具有与你的特定场景更相关的指标的个性化仪表板,Kibana 提供了强大的仪表板构建工具,允许你创建指标的各种可视化效果。
下面,我创建了一些可视化效果和图表来监控,例如,一段时间内搜索最多的术语、没有返回结果的查询、突出显示搜索最多的术语的词云,最后是地理可视化,用于识别搜索访问来自何处。
结论
在本文中,我们实施了一种混合搜索解决方案,该解决方案结合了关键字和向量搜索,为用户提供了更准确、更相关的结果。我们还探讨了如何使用其他功能(例如使用固定查询的方面和结果个性化)来创建更完整、更高效的搜索体验。
此外,我们集成了 Elastic 的行为分析来捕获和分析用户与搜索引擎交互时的行为。通过使用 trackPageView、trackSearch 和 trackSearchClick 等方法,我们能够监控搜索查询、搜索结果点击次数和页面浏览量,从而对搜索行为产生有价值的见解。
参考文献
数据集
Transformer
倒数排序融合
- https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/retriever.html#rrf-retriever
Knn 查询
固定查询
行为分析 API
- https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-apis.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-overview.html
准备好自己尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训何时开课!
原文:How to use Hybrid search for an e-commerce product catalog - Search Labs
标签:电子商务,产品目录,结果,干性,查找,搜索,query,type,我们 From: https://blog.csdn.net/UbuntuTouch/article/details/143757769