设为首页 加入收藏

TOP

〈三〉ElasticSearch的认识:搜索、过滤、排序(四)
2019-09-23 11:18:14 】 浏览:159
Tags:ElasticSearch 认识 搜索 过滤 排序
t;,"book_summary"] } }, "highlight": { "fields": { "book_summary":{}, "book_name":{} } } }


上面展示了关于全搜索单字段值全文搜索多字段单一搜索值全文搜索短语搜索字段过滤高亮搜索的代码。


由于对多个字段使用不同搜索值涉及条件拼接,所以单独讲。
前置知识讲解:对于条件拼接,在SQL中有and,or,not,在ElasticSearch不太一样,下面逐一讲解:

  • bool:用来表明里面的语句是多条件的组合,用来包裹多个条件。
  • should:里面可以有多个条件,查询结果必须符合查询条件中的一个或多个。
  • must:里面的多个条件都必须成立
  • must_not:里面的多个条件必须不成立


示例:

// 书名必须包含Story的
GET /douban/book/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match":{
            "book_name":"Story"
          }
        }
      ]
    }
  }
}

// 书名必须不包含Story的
GET /douban/book/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match":{
            "book_name":"Story"
          }
        }
      ]
    }
  }
}

// 书名必须不包含Story,书名包含Adventures或Immortality的
GET /douban/book/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match":{
            "book_name":"Story"
          }
        }
      ],
      "should": [
        {
          "match": {
            "book_name": "Adventures"
          }
        },
        {
          "match": {
            "book_name": "Immortality"
          }
        }
      ]
    }
  }
}


// 在should、must、must_not这些里面都可以放多个条件
GET /douban/book/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match":{
            "book_name":"Story"
          }
        },
        {
          "match": {
            "book_name": "Adventures"
          }
        }
      ]
    }
  }
}

// 如果是单个条件的时候,还可以这样写,省去[]:
GET /douban/book/_search
{
  "query": {
    "bool": {
      "must_not": {
          "match":{
            "book_name":"Story"
          }
      }
    }
  }
}

// 还可以条件嵌套,也就是再嵌套一层bool,不过要注意逻辑,例如:
// 查询出(书名有story)或者(书名有The而且作者名有David)的,第二个是可成立可不成立的。
GET /douban/book/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "book_name": "Story"
          }
        },
        {
          "bool": {
            "must": [
              {
                "match": {
                  "book_name": "The"
                }
              },
              {
                "match": {
                  "book_author": "David"
                }
              }
            ]
          }
        }
      ]
    }
  }
}




补充:

  • 上面讲了URL参数条件搜索和请求体条件搜索,讲了全搜索单字段值全文搜索多字段单一搜索值全文搜索短语搜索字段过滤高亮搜索的使用方法,还讲了基于bool、should、must、must_not的多条件搜索,上面的知识已经能基础地实现一些搜索功能了。但还是有一些知识由于比较晦涩,所以留到后面章节讲,比如给搜索指定分词器、给多条件指定匹配数量、滚动查询等等。




小节总结:

上面讲了URL参数条件搜索和请求体条件搜索。URL参数条件写在URL里面,用?来附带参数,q用来指定搜索字段。请求体参数把条件写在请求体中,query是最外层的包裹,match_all用于查询所有,match用来使用指定搜索值搜索某一字段,match_phrase用来搜索连续的搜索,_source用来字段过滤(与query同级,[]里面是字段名),highlight用来高亮搜索(与query同级,里面是{field:{字段名1:{},字段名2:{}}}),bool、should、must、must_not用来多条件搜索。



文档的过滤filter




过滤的效果其实有点像条件搜索,不过条件搜索会考虑相关度分数和考虑分词,而过滤是不考虑这些的,过滤对相关度没有影响。过滤一般用于结构化的数据上,也就是通常不用于使用了分词的数据上,通常都会用在数值类型和日期类型的数据上。


在搜索的时候,如果你不希望要搜索的条件会影响到相关度,那么就把它放在过滤中,如果希望影响相关度,那么就放在条件搜索中。
使用过滤时,由于不考虑相关度,所以score固定为1。


文档的过滤filter里面主要有五种字段,range,term,terms,exist,missing。range用于字段数据比较大小;term主要用于比较字符类型的和数值类型的数据是否相等;terms是term的复数版,里面可以有多个用于比较相等的值;exist和missing用于判断文档中是否包含指定字段或没有某个字段(仅适用于2.0+版本,目前已经移除)




语法与举例:

// range,gte是不小于,lte是不大于,eq是等于,gt是大于,lt是小于
GET / index/type/_search
{
  "query": {
    "range": {
      "字段名": {
        &
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SQL DROP INDEX 语句 下一篇Part_one:Redis第一次接触

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目