文档的搜索
搜索的方式主要有两种,URL搜索和请求体搜索,一个是将搜索的条件写在URL中,一个是将请求写在请求体中。

  • URL参数条件搜索
语法:GET /index/type/_search?参数

参数解析:

q:使用某个字段来进行查询,例如q=book_name:book,就是根据book_name中是否有book来进行搜索。
sort:使用某个字段来进行排序,例如sort=cost:desc,就是根据cost字段来进行降序desc排序。
其他:fileds,timeout,analyzer【这些参数留在请求体搜索中讲】
不带参数时,为“全搜索”
多个参数使用&&拼接
示例:

GET /douban/book/_search?q=book_summary:character
GET /douban/book/_search?q=book_author:Milan
GET /douban/book/_search?q=book_summary:a
GET /douban/book/_search?q=book_summary:a&&sort=book_pages:desc
GET /douban/book/_search?q=book_summary:a&&q=book_author:Milan

【值得注意的是,请先不要对text类型的数据进行排序,这会影响搜索,对整数排序即可】

  • 请求体条件搜索
//全搜索
GET /index/type/_search
GET /douban/book/_search

//全搜索
GET /index/type/_search
{
  "query": {
    "match_all": {}
  }
}
GET /douban/book/_search
{
  "query": {
    "match_all": {}
  }
}

// 查询指定字段的数据(全文搜索,如果搜索值有多个词,仅匹配一个词的结果也可以查询出来):
GET /index/type/_search
{
  "query": {
    "match": {
      "字段名": "搜索值"
    }
  }
}
GET /douban/book/_search
{
  "query": {
    "match": {
      "book_name": "A The"
    }
  }
}


// 使用同一搜索值搜索多个字段:
GET /index/type/_search
{
  "query": {
    "multi_match": {
      "query": "搜索值",
      "fields": [
        "搜索的字段1","搜索的字段2"]
    }
  }
}
GET /douban/book/_search
{
  "query": {
    "multi_match": {
      "query": "A",
      "fields": [
        "book_name","book_summary"]
    }
  }
}

// 短语查询:【搜索值必须完全匹配,不会把搜索值拆分来搜索】
GET /index/type/_search
{
  "query": {
    "match_phrase": {
      "字段": "搜索值"
    }
  }
}
GET /douban/book/_search
{
  "query": {
    "match_phrase": {
      "book_summary": "a character"
    }
  }
}

// 字段过滤,查询的结果只显示指定字段
GET /product/book/_search
{
  "query": {
    "查询条件"
  },
  "_source": [
    "显示的字段1",
    "显示的字段2"
    ]
}
GET /douban/book/_search
{
  "query": {
    "match": {
      "book_name": "Story"
    }
  },
  "_source": [
    "book_name",
    "book_id"
    ]
}

// 高亮查询:【根据查询的关键字来进行高亮,高亮的结果会显示在返回结果的会自动在返回结果中的highlight中,关键字会被加上<em>标签】
// 如果想要多字段高亮,也需要进行多字段搜索
GET /index/book/_search
{
  "query": {
    "查询条件"
  },
  "highlight": {
    "fields": {
      "高亮的字段名1": {}
    }
  }
}
GET /douban/book/_search
{
  "query": {
    "match": {
      "book_summary": "Story"
    }
  },
  "highlight": {
    "fields": {
      "book_summary":{}
    }
  }
}
GET /douban/book/_search
{
  "query": {
    "multi_match": {
      "query": "Story",
      "fields": [
        "book_name","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用来多条件搜索。