php – 可以使用弹性搜索来提升“最新”项目吗? (FOQElasticaBundle)

我正在通过FOQElasticaBundle在Symfony2应用程序中执行弹性搜索,迄今为止,基于对“故事”实体的各个领域的推广,它一直在努力。这是配置:

foq_elastica:
    clients:
        default: { host: localhost, port: 9200 }

    indexes:
        website:
            client: default
            types:
                story:
                    mappings:
                        title: { boost: 8 }
                        summary: { boost: 5 }
                        text: { boost: 3 }
                        author:
                    persistence:
                        driver: orm # orm, mongodb, propel are available
                        model: Acme\Bundle\StoryBundle\Entity\Story
                        provider:
                            query_builder_method: createIsActiveQueryBuilder
                        listener:
                            service: acme_story.search_index_listener
                        finder:

不过,我也想根据故事的“published_at”日期进行推广,所以昨天发布的一个故事会在6个月前发表的故事之前出现在这个结果中 – 即使老旧的故事有一个更好的得分(显然这将需要一点调整)。这可能吗?

如果有人能让我知道如何使用FOQElasticaBundle来实现这一点,那将是很棒的,但否则我会感激它,如果你可以让我知道如何直接在弹性搜索中实现这一点,所以我可以尝试和实现自己的行为,并贡献于捆绑,如果需要。

谢谢。

呃,经过很多实验和拖网之后,我终于设法获得了所期望的行为! (全额到Clinton Gormley.)

映射配置:

mappings:
    title: { boost: 8 }
    summary: { boost: 5 }
    text: { boost: 3 }
    author:
    publishedAt: { type: date }

以下是使用PHP客户端Elastica的代码,使用原始映射动态构建查询以及发布日期:

$query = new \Elastica_Query_Bool();
$query->addMust(new \Elastica_Query_QueryString($queryString));

$ranges = array();
for ($i = 1; $i <= 5; $i++) {
    $date = new \DateTime("-$i month");

    $currentRange = new \Elastica_Query_Range();
    $currentRange->addField('publishedAt', array(
        'boost' => (6 - $i),
        'gte' => $date->getTimestamp()
    ));

    $ranges[] = $currentRange->toArray();
}

$query->addShould($ranges);

/** @var $pagerfanta Pagerfanta */
$pagerfanta = $this->getFinder()->findPaginated($query);

而对于那些对原始的弹性搜索查询更感兴趣(只有3个日期范围简洁)…

curl -XPOST 'http://localhost:9200/website/story/_search?pretty=true' -d '
{
  "query" : {
    "bool" : {
      "must" : {
        query_string: {
          query: "<search term(s)>"
        }
      },
      "should" : [
        {
          "range" : {
            "publishedAt" : {
              "boost" : 5,
              "gte" : "<1 month ago>"
            }
          }
        },
        {
          "range" : {
            "publishedAt" : {
              "boost" : 4,
              "gte" : "<2 months ago>"
            }
          }
        },
        {
          "range" : {
            "publishedAt" : {
              "boost" : 3,
              "gte" : "<3 months ago>"
            }
          }
        }
      ]
    }
  }
}'
http://stackoverflow.com/questions/12091365/is-it-possible-to-boost-newest-items-using-elasticsearch-foqelasticabundle

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – 可以使用弹性搜索来提升“最新”项目吗? (FOQElasticaBundle)