如何在弹性搜索中提升特定术语?

时间:2019-11-14 17:37:40

标签: elasticsearch kibana

如果我具有以下映射:

PUT /book
{
  "settings": {},
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "author": {
        "type": "text"
      }
    }
  }
}

我如何提升特定作者的地位? 对于以下示例:

PUT /book/_doc/1
{
  "title": "car parts",
   "author": "john smith"
}

PUT /book/_doc/2
{
  "title": "car",
   "author": "bob bobby"
}

PUT /book/_doc/3
{
  "title": "soap",
   "author": "sam sammy"
}

PUT /book/_doc/4
{
  "title": "car designs",
   "author": "joe walker"
}

GET /book/_search
{
   "query": {  
      "bool": {                    
        "should": [
             { "match": { "title": "car" }},
              { "match": { "title": "parts" }} 
         ]
       }
   }
}

如何做到这一点,以便我的搜索将在搜索结果顶部显示“乔·沃克”给我的书?

1 个答案:

答案 0 :(得分:0)

一种解决方案是利用function_score

  

function_score允许您修改查询检索的文档分数。

From here

根据您的映射尝试运行此查询,例如:

GET book/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "title": "car"
              }
            },
            {
              "match": {
                "title": "parts"
              }
            }
          ]
        }
      },
      "functions": [
        {
          "filter": {
            "match": {
              "author": "joe walker"
            }
          },
          "weight": 30
        }
      ],
      "max_boost": 30,
      "score_mode": "max",
      "boost_mode": "multiply"
    }
  }
}

query中的function_score与您使用的相同的should查询。

现在,我们要从查询中获取所有结果,并为joe walker的书赋予更多权重(增加分数),这意味着其书的优先级高于其他书。

要实现这一点,我们创建了一个函数(在functions内部),该函数为由joe walker本书过滤的查询返回的每个文档计算一个新分数。

您可以使用砝码和其他参数。

希望有帮助