• 11.best fields策略(dis_max参数设置)


    主要知识点

    • 常规multi-field搜索结果分析
    • dis_max参数设置

       

    一、为帖子数据增加content字段

       

    POST /forum/article/_bulk

    { "update": { "_id": "1"} }

    { "doc" : {"content" : "i like to write best elasticsearch article"} }

    { "update": { "_id": "2"} }

    { "doc" : {"content" : "i think java is the best programming language"} }

    { "update": { "_id": "3"} }

    { "doc" : {"content" : "i am only an elasticsearch beginner"} }

    { "update": { "_id": "4"} }

    { "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} }

    { "update": { "_id": "5"} }

    { "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }

       

    二、多字段搜索(multi-field搜索)

    1、搜索titlecontent中包含javasolution的帖子

    GET /forum/article/_search

    {

    "query": {

    "bool": {

    "should": [

    { "match": { "title": "java solution" }},

    { "match": { "content": "java solution" }}

    ]

    }

    }

    }

       

    2、结果分析

       

    期望的排在第一位是doc5,结果是doc2,doc4排在了前面。原因如下:

    计算每个documentrelevance score的方式是:每个query的分数,乘以matched query数量,除以总query数量

       

    算一下doc4的分数

    { "match": { "title": "java solution" }},针对doc4,是有一个分数的,假设是1.1

    { "match": { "content": "java solution" }},针对doc4,也是有一个分数的,假设是1.2

    所以是两个分数加起来是2.3matched query数量 = 2,总query数量 = 2,计算的分数就是2.3 * 2 / 2 = 2.3

    算一下doc5的分数

    { "match": { "title": "java solution" }},针对doc5,是没有分数的

    { "match": { "content": "java solution" }},针对doc5,是有一个分数,假设是2.3

    matched query数量 = 1,总query数量 = 2,计算的分数就是2.3 * 1 / 2 = 1.15

    通过计算发现:doc4两个field匹配到一个关键词,分数反而高,doc5一个field匹配到两个关键词,分数反而低了,这样不符合我们的预期。

       

    三、best fields策略(dis_max参数设置)

    best fields策略,就是说,搜索到的结果中,如果某一个field中匹配到了尽可能多的关键词,那么就应被排在前面;而不是尽可能多的field匹配到了少数的关键词排在前面。

    dis_max语法,直接取多个query中,分数最高的那一个query的分数即可。

    { "match": { "title": "java solution" }},针对doc4,是有一个分数的,1.1

    { "match": { "content": "java solution" }},针对doc4,也是有一个分数的,1.2

    取最大分数,1.2

    { "match": { "title": "java solution" }},针对doc5,是没有分数的

    { "match": { "content": "java solution" }},针对doc5,是有一个分数的,2.3

    取最大分数,2.3

    所以doc5就可以排在更前面的地方,符合我们的需要。

    语法:

    GET /forum/article/_search

    {

    "query": {

    "dis_max": {

    "queries": [

    { "match": { "title": "java solution" }},

    { "match": { "content": "java solution" }}

    ]

    }

    }

    }

    另一种写法:结果是一样的。

    GET /forum/article/_search

    {

    "query": {

    "dis_max": {

    "tie_breaker": 0.7,

    "boost": 1.2,

    "queries": [

    {"bool": {"should": [

    {"match": {"title": "java solution"}},

    {"match": {"content": "java solution"}}

    ]

    }

    }]

    }

    }

       

  • 相关阅读:
    道路计划猿练级(笔者:陈浩)
    OpenCV——Delaunay三角 [转载]
    mysql声明摘要
    JDBC公共动作类
    Android SharedPreferences复杂的存储
    SAP ABAP规划 SY-REPID与SY-CPROG差额
    在我的眼里,生产主管(1)——如何做竞争分析
    Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
    SDUT 2894-C(最短spfa)
    人脉的本质
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8485221.html
Copyright © 2020-2023  润新知