Elasticsearch得分结果部分基于人气

时间:2015-07-06 18:02:04

标签: solr elasticsearch lucene

我在这个项目中使用Elasticsearch,但Solr解决方案也可能是合适的。在查询中,我希望包含should子句的一部分,即使其他任何术语都不能,也会返回结果。这将用于文档流行度。我会定期计算阅读流行度,并使用数值为每个doc添加一个浮动字段。

这个想法是根据术语返回文档,但是当失败时,返回按受欢迎程度排名的流行文档。这些应按术语匹配分数或人气分数的大小排序。

我意识到我可以量化受欢迎程度并将其视为标签"最热门","更热","热" ...但是想要使用数字字段,因为排名已明确定义。

以下是我的数据的当前形式(来自id的获取):

GET /index/docs/ipad

返回一个示例对象

{
   "_index": "index",
   "_type": "docs",
   "_id": "doc1",
   "_version": 1,
   "found": true,
   "_source": {
      "category": ["tablets", "electronics"],
      "text": ["buy", "an",  "ipad"],
      "popularity": 0.95347457,
      "id": "doc1"
   }
}

当前查询格式

POST /index/docs/_search
{
   "size": 10,
   "query": {
      "bool": {
         "should": [
            {"terms": {"text": ["ipad"]}}
         ],
         "must": [
            {"terms": {"category": ["electronics"]}}
         ]
      }
   }
}

这似乎是一种奇怪的查询格式,但这些是结构化对象,而不是自由格式文本。

我是否可以为此查询添加热门程度,以便它返回按受欢迎程度排名的项目以及should条款返回的项目?我将实际条款提升到高于受欢迎程度,以便他们受到青睐。

注意我不希望按受欢迎程度提升,如果查询的其余部分没有返回任何内容,我想返回热门。

2 个答案:

答案 0 :(得分:1)

我能想到的一种方法是将match_all filter包裹在constant score中 并使用排序后跟人气

示例:

    {
   "size": 10,
   "query": {
      "bool": {
         "should": [
            {
               "terms": {
                  "text": [
                     "ipad"
                  ]
               }
            },
            {
               "constant_score": {
                  "filter": {
                     "match_all": {}
                  },
                  "boost": 0
               }
            }
         ],
         "must": [
            {
               "terms": {
                  "category": [
                     "electronics"
                  ]
               }
            }
         ],
         "minimum_should_match": 1
      }
   },
   "sort": [
      {
         "_score": {
            "order": "desc"
         }
      },
      {
         "popularity": {
            "unmapped_type": "double"
         }
      }
   ]
}

答案 1 :(得分:0)

您想要查看function score query和衰减函数。

这是一个温和的介绍:https://www.found.no/foundation/function-scoring/