【问题标题】:Elasticsearch - use a field match to boost only and not to fetch the documentElasticsearch - 使用字段匹配来提升而不是获取文档
【发布时间】:2021-07-12 17:00:38
【问题描述】:

我有一个查询短语需要在任一字段中匹配 - namesummarydescriptionname 字段上的完全匹配。

现在,我又多了一个新字段brand。此字段中的匹配应仅用于提升结果。这意味着如果仅在 brand 字段中存在匹配项,则该文档不应出现在结果集中。

要解决没有brand 的问题,我有以下查询:

query: {
   bool: {
      minimum_should_match: 1,
      should: [
         multi_match:{
             query : "Cadbury chocklate milk",
             fields : [name, summary, description]
         },
         term: {
             name_keyword: {
                value: "Cadbury chocklate milk"
             }
         }
      ]
   }
}

这对我来说很好。

如何使用相同的查询获取数据,但提升具有brand:cadbury 的文档,而不增加召回集(基于brand:cadbury 的匹配)。

谢谢!

【问题讨论】:

  • 如果品牌中没有匹配项,是否仍要返回现有查询?
  • 是的。考虑品牌中的匹配只是为了提高结果。

标签: elasticsearch


【解决方案1】:

在内部使用bool 必须should 为您工作。

multi_match 有多种类型,短语你必须使用type:phrase

{
  "query": {
   "bool": {
      "must": [
         { "bool" : 
      { "should" : [ {
         "multi_match" :{
            "type" : "phrase",
             "query" : "Cadbury chocklate milk",
             "fields" : ["name", "summary", "description"]
         }  }, {
         "term": {
             "name_keyword": {
                "value": "Cadbury chocklate milk"
             }  }
         }
      ]
      }   
    } 
  ],
   "should" :  {
     "term" : {
          "brand" :  { 
        "value" :  "cadbury"
       }
    }
  }

}
}

【讨论】:

  • 第二个应该查询不会添加任何分数:(所以,顺序没有改变。在查找解释时,我没有看到brand:cadbury match anyhwere
  • 你能展示你的映射吗?品牌字段的类型是什么。
  • keyword ? 需要文字和分析吗?
  • 如果保存为关键字且值为cadbury,则必须准确搜索cadbury。大小写应该相同,值也应该相同。对于关键字,使用术语查询作为答案。
  • 愚蠢的??‍♂️ 索引中是Cadbury
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多