PUT /spider/ # 创建索引
POST /spider/ # 并不能用于创建索引,报错
PUT /spider/movies/1/ # 插入document,索引为1,若数据存在,则为覆盖更新
POST /spider/movies/ # 插入文档,随机生成索引
HEAD /spider/ # 用于验证 索引或document是否存在,若存在则返回200状态码,不存在则返回404.
HEAD /spider/movies/1/
DELETE /spider/ # 删除索引
DELETE /spider/movies/1/ # 删除文档
PUT /test03/user/1
{
"name":"huyande",
"age":26,
"desc":"我爱北京天安门",
"tags":["技术宅","温暖","友善"]
}
PUT /test03/user/1
{
"name":"张三",
"age":26,
"desc":"我爱北京天安门",
"tags":["技术宅","温暖","友善"]
}
POST /test03/user/1/_update
{
"doc":{
"name":"李四"
}
}
GET /test03/user/1
GET /test03/user/_search?q=name:huyande
GET /test_index/test_type/_search?q=+test_field:test #+是必须包含
GET /test_index/test_type/_search?q=-test_field:test #-是不包含
DSL:Domain Specified Language,特定领域的语言
http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法
term主要用于精确匹配那些值,比如数字,日期,布尔值或者 not_analyzed的字符串(未经分析的文本数据)
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配
查询是直接通过倒排索引指定的词条进程精确查找
GET /test03/user/_search
{
"query": {
"term":{
"age":26
}
}
}
GET /test03/user/_search
{
"query": {
"terms":{
"age":[26,286]
}
}
}
range过滤允许我们按照指定范围查找一批数据
GET /test03/user/_search
{
"query": {
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
}
exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件
# 将有name 字段的输出出来
GET /test03/user/_search
{
"query": {
"exists": {
"field": "name"
}
}
}
# 查询年龄是26岁 name字段不是王的数据
GET /test03/user/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"age": {
"value": 26
}
}
}
],
"must_not": [
{
"term": {
"name": {
"value": "王"
}
}
}
]
}
}
}
bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score
GET /test03/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "王麻子"
}
}
]
}
}
}
#查询 年龄是26岁的 或者 名字叫张三的
GET /test03/user/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"age": {
"value": "26"
}
}
},
{
"bool":{
"must": [
{
"match": {
"name": "张三"
}
}
]
}
}
]
}
}
}
使用match_all 可以查询所有的文档 ,是没有条件下的默认查询语句
GET /test03/user/_search
{
"query": {
"match_all": {}
}
}
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符
GET /test03/user/_search
{
"query": {
"match": {
"desc":"北京天安门"
}
}
}
multi_match查询允许你做match查询的基础上同时搜索多个字段
#在name 和desc字段中搜索 ‘张三在北京’
GET /test03/user/_search
{
"query": {
"multi_match": {
"query": "张三在北京",
"fields": ["name", "desc"],
"type": "best_fields"
}
}
}
GET /test03/user/_search
{
"query": {
"multi_match": {
"query": "张四爱北京",
"fields": ["name", "desc"],
"type": "best_fields",
"tie_breaker": 0.3
}
}
}
#tie_breaker是将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker参数将其它每个匹配的子句的分值乘以tie_breaker,以达到取得最佳匹配查询子句的_score
#计算公式
#score=best_field.scoreboost+other_fieldsboost.score*tie_breaker
GET /area/_search
{
"query": {
"multi_match": {
"query": "河南省郑州市",
"fields": ["province", "city"],
"type": "cross_fields",
"operator": "and"
}
}
}
#operator使用and,是要返回两者同时匹配成功的结果。
短语查询,full text search 是一个词组,意味着三个词的位置是连续且有顺序
GET /test03/user/_search
{
"query": {
"match_phrase": {
"desc":"安门,北京"
}
}
}
GET /test03/user/_search
{
"match_phrase": {
"title": {
"query": "full text search",
"slop":1
}
}
}
# slop 参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配
与词组中最后一个词条进行前缀匹配
类似于百度 中的搜索提示
GET /test03/user/_search
{
"query": {
"match_phrase_prefix": {
"desc": {
"query": "北京 哇哦"
}
}
}
}
1、北京 就是去进行match,搜索对应的doc
2、哇哦,会作为前缀,去扫描整个倒排索引,找到所有哇哦开头的doc
3、然后找到所有doc中,即包含北京 ,又包含哇哦开头的字符的doc
4、根据你的slop去计算,看在slop范围内,能不能让北京 哇哦,正好跟doc中的北京和哇哦开头的单词的position相匹配
{
"query": {
"regexp": {
"title": "W[0-9].+"
}
}
}
GET /test03/user/_search
{
"query": {
"match": {
"name": "王麻子"
}
},
"highlight": {
"fields": {
"name":{}
}
}
}
GET /test03/user/_search
{
"query": {
"match": {
"name": "王麻子"
}
},
"highlight": {
"pre_tags": "",
"post_tags": "
",
"fields": {
"name":{}
}
}
}
GET /test03/user/_search
{
"query": {
"match": {
"desc": "北京"
}
},
"from": 0,
"size": 2
}
GET /test03/user/_search
{
"_source":["name"],
"query": {
"match": {
"desc": "北京"
}
},
"from": 0,
"size": 2
}