【问题标题】:Boosting Elasticsearch documents based on the query provided根据提供的查询提升 Elasticsearch 文档
【发布时间】:2014-03-06 17:19:21
【问题描述】:

这有点奇怪,虽然我想对于我们这些在电子商务领域工作的人来说并不是这样。

我在英国最大的儿童零售商之一工作。我们目前正在将我们的电子商务平台的演示与 Elasticsearch 而非我们目前用于搜索的第 3 方解决方案相结合。第 3 方解决方案每月花费我们数千英镑,而在 ES 之外运行我们的整个网站(搜索、范围页面和产品详细信息页面)所需的架构实际上只花费其中的一小部分。

我目前的大部分功能都可以通过 ES 正常工作。但是,我们的内容协调员确实需要能够(通过我们设计的 CMS)提升某些 VIP 产品,但基于提供的查询。他们知道文档 ID,并且他们知道要为其提升产品的查询字符串。我可以编写带有连接器的 CMS 以将此信息输入 ES,但我不确定下一步该做什么。

我考虑过的三个选项如下:

  1. 包含文档 ID 的单独 ES 索引(这是 产品 id),要提升的查询字符串,然后是提升 因素。
  2. 包含查询的文档本身的属性 要提升的字符串和提升因子。
  3. 另一个索引存储了针对要提升的查询的文档,首先执行此查询,然后将普通查询作为多查询的一部分并删除重复项。这是我最不喜欢的选择... :(

然后将使用 function_score 机制应用这些提升因子。你会选哪一个?为什么?有没有我错过的选项?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    好的,我设法让这个工作,有点...我不得不将我的查询分成 2 个查询。我创建了一个新索引,我们称之为boostvalues。在boostvalues 我有以下字段:

    1. item_code(字符串,未分析)
    2. query_string(字符串,用标准分析器分析)
    3. boost_factor(整数,未分析)

    然后,对于传入的每个搜索查询,我首先对 boostvalues 索引进行搜索。然后我使用任何返回的结果来动态填充 function_score 参数,如下所示:

        if(isset($boostResults) && is_array($boostResults) && (int)$boostResults['hits']['total']>0) {
            foreach($boostResults['hits']['hits'] as $boostValue) {
                $searchParams['body']['query']['function_score']['functions'][] = array(
                    "filter" => array("term" => array("id" => $boostValue['_source']['id'])),
                    "script_score" => array("script" => $boostValue['_source']['boostFactor'])
                );
            }
        }
    

    顺便说一下,我正在使用官方的 Elasticsearch PHP 库。这给出了预期的效果。在我尝试之前我没有意识到这种机制的美妙之处在于,在获取提升值时,我还可以使用函数评分来根据查询与存储的查询字符串的接近程度来修改提升因子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多