Elasticsearch学习之深入搜索一 --- 提高查询的精准度

1. 为帖子增加标题字段

POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"title" : "this is java and elasticsearch blog"} }
{ "update": { "_id": "2"} }
{ "doc" : {"title" : "this is java blog"} }
{ "update": { "_id": "3"} }
{ "doc" : {"title" : "this is elasticsearch blog"} }
{ "update": { "_id": "4"} }
{ "doc" : {"title" : "this is java, elasticsearch, hadoop blog"} }
{ "update": { "_id": "5"} }
{ "doc" : {"title" : "this is spark blog"} }

2. 搜索标题中包含java或elasticsearch的blog

match query,是负责进行全文检索的。当然,如果要检索的field,是not_analyzed类型的,那么match query也相当于term query。

GET /forum/article/_search
{
    "query": {
        "match": {
            "title": "java elasticsearch"
        }
    }
}

3. 搜索标题中包含java和elasticsearch的blog

搜索结果精准控制的第一步:灵活使用and关键字,如果你是希望所有的搜索关键字都要匹配的,那么就用and,可以实现单纯match query无法实现的效果

GET /forum/article/_search
{
    "query": {
        "match": {
            "title": {
        "query": "java elasticsearch",
        "operator": "and"
           }
        }
    }
}

4. 搜索包含java,elasticsearch,spark,hadoop,4个关键字中,至少3个的blog

控制搜索结果的精准度的第二步:指定一些关键字中,必须至少匹配其中的多少个关键字,才能作为结果返回

GET /forum/article/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch spark hadoop",
        "minimum_should_match": "75%"
      }
    }
  }
}

5. 用bool组合多个搜索条件,来搜索title

GET /forum/article/_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "java" }},
      "must_not": { "match": { "title": "spark"  }},
      "should": [
                  { "match": { "title": "hadoop" }},
                  { "match": { "title": "elasticsearch"   }}
      ]
    }
  }
}

6. bool组合多个搜索条件,如何计算relevance score

must和should搜索对应的分数,加起来,除以must和should的总数

排名第一:java,同时包含should中所有的关键字,hadoop,elasticsearch
排名第二:java,同时包含should中的elasticsearch
排名第三:java,不包含should中的任何关键字

  should是可以影响相关度分数的,must是确保说,谁必须有这个关键字,同时会根据这个must的条件去计算出document对这个搜索条件的relevance score,在满足must的基础之上,should中的条件,不匹配也可以,但是如果匹配的更多,那么document的relevance score就会更高

7. 搜索java,hadoop,spark,elasticsearch,至少包含其中3个关键字

  默认情况下,should是可以不匹配任何一个的,比如上面的搜索中,this is java blog,就不匹配任何一个should条件,但是有个例外的情况,如果没有must的话,那么should中必须至少匹配一个才可以,比如下面的搜索,should中有4个条件,默认情况下,只要满足其中一个条件,就可以匹配作为结果返回,但是可以精准控制,should的4个条件中,至少匹配几个才能作为结果返回

GET /forum/article/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "java" }},
        { "match": { "title": "elasticsearch"   }},
        { "match": { "title": "hadoop"   }},
        { "match": { "title": "spark"   }}
      ],
      "minimum_should_match": 3
    }
  }
}

(1) 全文检索的时候,进行多个值的检索,有两种做法,match query;should
(2) 控制搜索结果精准度:and operator,minimum_should_match

时间: 2024-10-04 05:33:27

Elasticsearch学习之深入搜索一 --- 提高查询的精准度的相关文章

Elasticsearch学习之深入搜索六 --- 平衡搜索结果的精准率和召回率

1. 召回率和精准度 比如你搜索一个java spark,总共有100个doc,能返回多少个doc作为结果,就是召回率,recall 精准度,比如你搜索一个java spark,能不能尽可能让包含java spark,或者是java和spark离的很近的doc,排在最前面,precision 直接用match_phrase短语搜索,会导致必须所有term都在doc field中出现,而且距离在slop限定范围内,才能匹配上 match phrase,proximity match,要求doc必须

Elasticsearch学习之深入搜索三 --- best fields策略

1. 为帖子数据增加content字段 POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"content" : "i like to write best elasticsearch article"} } { "update": { "_id": "2&q

Elasticsearch学习之深入搜索四 --- cross-fields搜索

1. cross-fields搜索 一个唯一标识,跨了多个field.比如一个人,标识,是姓名:一个建筑,它的标识是地址.姓名可以散落在多个field中,比如first_name和last_name中,地址可以散落在country,province,city中.跨多个field搜索一个标识,比如搜索一个人名,或者一个地址,就是cross-fields搜索.初步来说,如果要实现,可能用most_fields比较合适.因为best_fields是优先搜索单个field最匹配的结果,cross-fie

Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析

1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"}} 使用诸如上面的match query进行多值搜索的时候,es会在底层自动将这个match query转换为bool的语法,bool should,指定多个搜索词,同时使用term query { "bool": { "should": [ { "term&

Elasticsearch学习之深入搜索五 --- phrase matching搜索技术

1. 近似匹配 什么是近似匹配,两个句子 java is my favourite programming language, and I also think spark is a very good big data system.java spark are very related, because scala is spark's programming language and scala is also based on jvm like java. match query,搜索j

Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk

一.批量查询  mget GET /_mget { "docs":[ { "_index":"ecommerce", "_type":"product", "_id":1 }, { "_index":"ecommerce", "_type":"product", "_id":2 } ] }

Elasticsearch系列---多字段搜索

概要 本篇介绍一下multi_match的best_fields.most_fields和cross_fields三种语法的场景和简单示例. 最佳字段 bool查询采取"more-matches-is-better"匹配越多分越高的方式,所以每条match语句的评分结果会被加在一起,从而为每个文档提供最终的分数_score.能与两条语句同时匹配的文档会比只与一条语句匹配的文档得分要高,但有时这样也会带来一些与期望不符合的情况,我们举个例子: 我们以英文儿歌为案例背景,我们这样搜索: G

微信语音红包小程序开发如何提高精准度 红包小程序语音识别精准度 微信小程序红包开发语音红包

公司最近开发的一个微信语音红包,就是前些时间比较火的包你说红包小程序.如何提高识别的精准度呢. 在说精准度之前,先大概说下整个语音识别的开发流程.前面我有文章已经说到过了.具体我就不谈了.一笔带过. 先是通过小程序前端调动语音录制功能拿到客户说的语音,比如mp3格式,然后通过百度的语音识别算法,转为文字.具体看百度语音识别的接口.地址http://yuyin.baidu.com/docs/asr/188 返回的格式如下: // 成功返回 { "err_no": 0, "err

Elasticsearch学习,请先看这一篇!

题记: Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识.原理从初学者认知.学习的角度,从以下9个方面进行详细梳理.欢迎讨论-- 0. 带着问题上路--ES是如何产生的? (1)思考:大规模数据如何检索? 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题: 1)用什么数据库好?(mysql.sybase.oracle.达梦.神通.mongodb.hbase-) 2)如何解决单点故障:(lvs.F5.A10.Zo