ElasticSearch(4)

之前说了很多查询,接下来继续:

我们可以利用query_string的关键词来做匹配,可以省去之前用写bool加两个must的方式。例如:

GET /movie/_search
{
  "query": {
    "query_string": {
      "fields": ["title"],
      "query": "steve AND jobs"
    }
  }
}

filter,关于filter的但条件过滤之前就讲过了,回顾一下:

GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term":{"title":"steve"}
        }
      ]
    }
  }
}

那么多条件过滤呢?

GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [
        {"term":{"title":"steve"}},
        {"term":{"cast.name":"gaspard"}},
        {"range":{"release_date":{"lte":"2015/01/01"}}},
        {"range":{"popularity":{"gte":"25"}}}
      ]
    }
  },
  "sort": [
    {
      "popularity": {
        "order": "desc"
      }
    }
  ]
}

先提一下,一般filter过滤是打分都是0,所以都用term精确匹配。关于“range”更像是大于小于的排序。

那如果想在filter中还带条件呢?

GET /movie/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "title": "life"
        }}
      ], 
      "filter": [
        {"term":{"title":"steve"}},
        {"term":{"cast.name":"gaspard"}},
        {"range":{"release_date":{"lte":"2015/01/01"}}},
        {"range":{"popularity":{"gte":"25"}}}
      ]
    }
  }
}

当布尔表达式中有filter的时候,也就是说即便should不满足条件也会返回,只不过返回的是0而已,那should加filter一起的话,filter控制条件搜索,should控制打分,那么两个一起用,有结果二者都满足的话,也就有分数了。


关于查全率和查准率

查全率:例如一共有100个文档,正确的结果有60个文档,而查询出来正确的有40个,这样的查全率就是40/60

查准率:查出了40个文档,里面有30个是正确的,那么查准率就是30/40

这里的正确是人为感知的正确。例如查询“苹果”,会显示出食物和手机,那么二者只有一个是正确的。

虽然二者不可兼得,但可以调整排序。

自定义score算法:

GET /movie/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "steve jobs",
          "fields": ["title","overview"],
          "operator": "or",
          "type": "most_fields"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",
            "factor": 10
          }
        }
      ]
    }
  }
}

打开分数监控可以看出,在tf/idf的打分下面,还有一个打分:

这就是我们上面自定义的分数,乘以之前的分数,就得到了现在的分数。当然从上面代码也可以看出,functions是个数组,可以放多个,需要注意的是,这里面的分数都是相乘的。

当然这个分数相乘会变得很大,所以添加命令,使相乘变成相加:其中score_mode是指function内部分数相加,boost_mode指function得分与TF/IDF得分相加。

GET /movie/_search
{"explain": true, 
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "steve jobs",
          "fields": ["title","overview"],
          "operator": "or",
          "type": "most_fields"
        }
        
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",    //将字段值+2后计算对数
            "factor": 10            //字段预处理*10
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}
发布了97 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/haozi_rou/article/details/104776509