Elastic.co/Elastic search - 具有多个Boosting查询的相关性反馈

时间:2015-08-12 14:10:13

标签: search elasticsearch relevance boosting

我正在尝试为弹性搜索(Elastic.co)实施相关性反馈。

我知道boosting queries,它允许指定正面和负面术语,其想法是对负面术语进行折扣,而不排除它们,就像在布尔值must_not中那样。< / p>

但是,我正在努力实现正面和负面的 分层提升

也就是说,我想获取分级正面和负面术语列表并生成一个查询,以便有不同的正面和负面增强层,每个层包含自己的查询术语。

类似(伪查询):

query{
 {
 terms: [very relevant terms]
 pos_boost: 3
 }
 {
 terms: [relevant terms]
 pos_boost: 2
 }
 {
 terms: [irrelevant terms]
 neg_boost: 0.6
 }
 {
 terms: [very irrelevant terms]
 neg_boost: 0.3
}
}

我的问题是,使用嵌套的提升查询是否可以实现这一目标,或者如果我使用多个应该子句,我的情况会更好。

我担心的是,我不确定bool查询的should子句中0.2的提升是否仍会使文档得分正增加,因为我想折扣文件,而不是提高分数。

通过提升查询,我担心的是我无法控制条款加权的程度。

非常感谢任何帮助或其他实施的建议。 (我真正想做的是为相关文档创建语言模型并使用它来排名,但我不知道如何通过弹性来轻松实现。)

3 个答案:

答案 0 :(得分:1)

似乎您可以合并bool查询并使用boosting query clauses调整提升值。

POST so/boost/ {"text": "apple computers"}
POST so/boost/ {"text": "apple pie recipe"}
POST so/boost/ {"text": "apple tree garden"}
POST so/boost/ {"text": "apple iphone"}
POST so/boost/ {"text": "apple company"}

GET so/boost/_search
{
 "query": {
   "bool": {
     "must": [
       {
         "match": {
           "text": "apple"
         }
       }
     ], 
     "should": [
       {
         "match": {
           "text": {
             "query": "pie",
             "boost": 2
           }
         }
       },
       {
         "match": {
           "text": {
             "query": "tree",
             "boost": 2
           }
         }
       },
       {
         "match": {
           "text": {
             "query": "iphone",
             "boost": -0.5
           }
         }
       }
     ]
   }
 } 
} 

答案 1 :(得分:1)

或者,如果您想在索引时将语言模型编码到集合中,可以尝试此处描述的方法:Elasticsearch: Influence scoring with custom score field in document

答案 2 :(得分:0)

在查询时根据自定义/变量提升值(即条件提升)提升弹性搜索文档(基于优先级的搜索查询)。

Java编码示例:

customerKeySearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery(keys.type",  "xxx"));
customerTypeSearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("keys.keyValues.value", "xxxx"));                     
keyValueQuery = QueryBuilders.boolQuery().must(customerKeySearch).must(customerTypeSearch).boost(2f);

customerKeySearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery(keys.type",  "xxx"));
customerTypeSearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("keys.keyValues.value", "xxxx"));                     
keyValueQuery = QueryBuilders.boolQuery().must(customerKeySearch).must(customerTypeSearch).boost(6f);

描述和搜索查询:

弹性搜索有其内部得分计算技术,因此我们需要通过在java中为了使用自定义提升效果将disableCoord(true)属性设置为true来禁用此机制。

以下布尔查询正在运行查询,以根据提升值提升弹性搜索索引中的文档。

 {
  "bool" : {
    "should" : [ {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "XXXX"
              }
            }
          }
        } ],
        "boost" : 2.0
      }
    }, {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "500072388315"
              }
            }
          }
        } ],
        "boost" : 6.0
      }
    }, {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "XXXXXX"
              }
            }
          }
        } ],
        "boost" : 10.0
      }
    } ],
    "disable_coord" : true
  }
}