TypechoJoeTheme

顿搜

统计

04. 指定分值查询——ElasticSearch搜索专栏

2022-06-13
/
0 评论
/
246 阅读
/
正在检测是否收录...
06/13

一、Constant Score查询

如果不想让检索词频率TF(Term Frequency)对搜索结果排序有影响

只想过滤某个文本字段是否包含某个词,可以使用Constant Score将查询语句包装起来。

1.1 DSL方式

GET /hotel/_search
{
  "_source": ["amenities"],  
  "query": {
   "constant_score": {    //满足条件即打分为1
      "filter": {
        "match": {        //查询设施中包含“停车场”的文档
          "amenities": "停车场"
        }
      }
    }
  }
}

在Constant Score搜索中,参数boost可以控制命中文档的得分,默认值为1.0

GET /hotel/_search
{
  "_source": ["amenities"],  
  "query": {
    "constant_score": {
      "boost": 2.0,               //设置Constant Score查询命中文档的得分为2.0
      "filter": {
        "match": {
          "amenities": "停车场"
        }
      }
    }
  }
}

1.2 Java 客户端方式

在Java客户端上构建Constant Score搜索时,可以使用ConstantScoreQueryBuilder类的实例进行构建

public void constantScoreSearch() {     
    //新建搜索请求
    SearchRequest searchRequest = new SearchRequest("hotel");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //构建设施包含“停车场”的constant score查询
    ConstantScoreQueryBuilder constantScoreQueryBuilder = new ConstantScoreQueryBuilder(
        QueryBuilders.termQuery("amenities", "停车场"));
    searchSourceBuilder.query(constantScoreQueryBuilder);
    constantScoreQueryBuilder.boost(2.0f);
    searchRequest.source(searchSourceBuilder);  //设置查询
   printResult(searchRequest);                  //打印结果
}

二、Function Score查询

当使用ES进行搜索时,命中的文档默认按照相关度进行排序。

有些场景下用户需要干预该“相关度”,此时就可以使用Function Score查询。

使用时,用户必须定义一个查询以及一个或多个函数,这些函数为每个文档计算一个新分数

2.1 DSL方式

GET /hotel/_search
{
  "_source": ["title","city"],  
  "query": {
    "function_score": {
      "query": {                 //查询符合条件的文档
        "term": {
          "city": {
            "value": "北京"
          }
        }
      },
      "functions": [             //定义函数
        {                        //此处只定义了一个函数:随机数函数
          "random_score": {}
        }
      ],
      "score_mode": "sum"        //最终分数是各个函数的加和值
    }
  }
}  

2.2 Java 客户端方式

在Java客户端中使用Function Score进行查询时,

可以调用ScoreFunctionBuilders.randomFunction()方法新建一个随机函数,

然后将该随机函数的实例传给QueryBuilders.functionScoreQuery()方法生成FunctionScoreQueryBuilder的实例

public void functionScoreSearch() {
    //创建搜索请求
    SearchRequest searchRequest = new SearchRequest("hotel");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //构建term查询
    TermQueryBuilder termQuery = QueryBuilders.termQuery("city", "北京");
     //构建随机函数
    ScoreFunctionBuilder<?> scoreFunction = ScoreFunctionBuilders.randomFunction();                                    
    //构建Function Score查询
    FunctionScoreQueryBuilder funcQuery = QueryBuilders.functionScoreQuery(
        termQuery, scoreFunction).boostMode(CombineFunction.SUM);
    searchSourceBuilder.query(funcQuery);
    searchRequest.source(searchSourceBuilder);  //设置查询请求
   printResult(searchRequest);                  //打印搜索结果
}
朗读
赞 · 0
版权属于:

顿搜

本文链接:

https://dun.so/archives/2871/(转载时请注明本文出处及文章链接)