根据提供的查询提升Elasticsearch文档

时间:2014-03-05 11:05:10

标签: elasticsearch

这有点奇怪,虽然对我们这些在电子商务世界工作的人来说并非如此。

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

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

我考虑的三个选项如下:

  1. 包含文档ID的单独ES索引(这是 产品id),提升的查询字符串然后是提升 因素。
  2. 文档本身包含查询的属性 字符串提升和提升因素。
  3. 另一个索引,其中包含针对查询存储的文档以进行提升,首先执行此查询,然后将常规查询作为多查询的一部分并删除重复项。这是我最不喜欢的选择...... :(
  4. 然后使用function_score机制应用这些增强因子。你会选哪一个?为什么?有没有我错过的选择?

1 个答案:

答案 0 :(得分:0)

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

  1. item_code(字符串,未分析)
  2. query_string(字符串,用std分析器分析)
  3. boost_factor(整数,未分析)
  4. 然后,对于每个进入的搜索查询,我首先搜索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库。这给出了期望的效果。在我尝试之前我没有意识到的这种机制的优点是,当获得提升值时,我还可以使用函数评分来根据查询与存储的查询字符串的接近程度来修改提升因子。