工程

通过基于搜索历史记录的结果打造个性化定制的 Elastic App Search

作者

借助 Elastic App Search,可为您的所有应用和网站平添可扩展且相关性高的搜索体验。它提供了很多开箱即用型的选项,用于对搜索结果进行个性化设置,例如权重和提权以及管理功能。您还可以添加这些文档您可能也感兴趣这一功能,以便能够为用户显示与他们之前搜索过的文档类似的其他内容。这篇博文将向您介绍使用强大的 App Search API 创建这个功能的具体流程。

构建搜索客户端

和往常一样,搜索客户端使用前端应用程序进行构建,但除了创建实际的建议视图之外,还有两个额外的要求:

  • 使用用户 ID 标记每个分析事件
    • 例如,对于每个查询和点击,您需要发送一个额外的分析标签参数:
    • curl -X GET 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/search' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer search-soaewu2ye6uc45dr8mcd54v8' \ 
      -d '{ 
        "query": "everglade",
        "analytics": { 
          "tags": ["UNIQUE_USER_ID"] 
        } 
      }'
          
  • 当需要一个包含建议结果的列表(搜索请求、页面加载等)时,应向外部控制器发出一个请求。

构建外部控制器

外部控制器是后端服务。您必须构建外部控制器来生成查询,以便能够根据这个用户以往的搜索内容填充文档列表。收到请求时,外部控制器将需要执行以下操作:

  1. 获取用户之前搜索过的词条:
    1. 调用 App Search 分析 API,以获取 m 时间段内,使用这个用户 ID 作为标签筛选出的n 个查询的列表。在下面的这个示例中,系统将返回标记为 UNIQUE_USER_ID 的用户在 2020 年最后两个月内的前 20 个查询。
    2. curl -X GET 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/analytics/queries' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer private-xxxxxxxxxxxxxxxxxxxxxxxx' \ 
      -d '{ 
        "filters": {  
          "all": [ 
            { 
              "date": { 
                "from":"2020-10-31T12:00:00+00:00" 
                "to":"2020-12-31T00:00:00+00:00" 
              } 
            }, { 
              "tag":"UNIQUE_USER_ID" 
            } 
          ] 
        },
        "page": { 
          "size":20 
        } 
      }'
          
  2. (可选)您可以排除通过搜索结果找到的文档,例如,如果您想推广对用户来说可能更新颖的内容或产品,就可以这么做。查找用户点击过的文档并将它们排除:
    1. 调用 App Search 分析 API,以获取按用户 ID 筛选的点击过文档的列表
  3. 生成建议文档:
    1. 使用第 1 步中生成的搜索词向 App Search 搜索 API 发出多搜索查询
    2. curl -X POST 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/multi_search' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer search-soaewu2ye6uc45dr8mcd54v8' \ 
      -d '{ 
        "queries": [ 
          {"query": "california"},
          {"query": "florida"} 
        ] 
      }'
              
    3. (可选)向这个查询添加一个筛选条件,以排除用户已点击过的文档(第 2 步中生成的建议文档)。
    4. 将查询结果返回至客户端。

常见问题解答和其他注意事项

以下列出了您在构建过程中要考虑的问题及其他事项。

除了按个人用户细分之外,我可以用它进行其他细分吗?

可以!您可以在任何您喜欢的细分方法中使用它。标签是关键。标签将使用您定义的字符串,因此可以按用户、按地理区域或者根据您对用户的了解而定义的任何其他群组来定义标签。 

但请记住,这些标签都需要通过搜索事件和点击事件来定义。如果您选择以后更改它并且没有记录这些数据,您将需要重新开始或以其他方式推断群组。

如果我想根据我拥有的其他任意用户数据显示搜索结果,该怎么办?

好主意!只要您可以将数据转换为查询词,就也可以通过修改外部控制器来包含这些搜索结果。

如何对这项功能进行调优?

除了现有的相关性调整设置,您还可以通过以下几种方式来精准化结果:

  • 更严格地限制返回的用户查询数
  • 更严格地限制返回的用户查询时间段
  • 限制从多搜索查询返回的总结果数

为什么我不能在前端使用?

如果您的客户端有用户查询的列表,并且有现成的文档(此条件不是必需的,例如带有 Cookie),您就可以实现前端使用。只是不要忘记,私有密钥是访问分析 API 所必需的,这是您绝对不想公开的内容。

后续步骤

如果您想尝试构建这个基于搜索历史记录的功能,可以在 Elastic Cloud 上快速部署 App Search 的免费试用版(或者也可以下载自管型版本)。如果您有任何问题,或者想让我们知道您的项目进展如何,请在我们的讨论论坛中给我们留言。