语法 范围
/_search 集群上所有的索引
/index1/_search index1
/index1,index2/_search index1,index2
/index*/_search 以index开头的索引

Term :Beautiful Mind 等效于 Beautiful OR Mind。使用括号括起来:(Beautiful Mind)

Phrase:"Beautiful Mind" 等效于 Beautiful AND Mind 。Phrase查询还要求前后顺序保持一致。使用引号

一、Url Search 

在url中使用查询参数

//查询title字段包含2013的
GET movies/_search?q=2012&df=title
{
  "profile": "true"
}
//查询title字段包含2013的
GET movies/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1m
{
  "profile": "true"
}

//查询所有字段包含2013的
GET movies/_search?q=2012
{
  "profile": "true"
}

//PhraseQuery
GET movies/_search?q=title:"Beautiful Mind"
{
  "profile": "true"
}

//TermQuery。两个Term在一起默认是 OR 的关系
GET movies/_search?q=title:(Beautiful Mind)
{
  "profile": "true"
}

//title 必须包括Beautiful 和 Mind
GET movies/_search?q=title:(Beautiful AND Mind)
{
  "profile": "true"
}
//title 必须包括Beautiful 和 Mind
GET movies/_search?q=title:(Beautiful %2BMind)
{
  "profile": "true"
}

//title 必须包括Beautiful 不能包括Mind
GET movies/_search?q=title:(Beautiful NOT Mind)
{
  "profile": "true"
}

//查询1980以后的电影
GET movies/_search?q=year:>=1980
{
  "profile": "true"
}

//title包含b开头的
GET movies/_search?q=title:b*
{
  "profile": "true"
}

//模糊匹配&近似匹配
GET movies/_search?q=title:beautifl~1
{
  "profile": "true"
}
GET movies/_search?q=title:"lord rings"~2
{
  "profile": "true"
}

 

 

二、Request Body Search 

使用elasticsearch提供的,基于json格式的更加完备的DSL

// 分页查询第一页,每页1条数据
GET kibana_sample_data_ecommerce/_search
{
  "from": 0,
  "size": 1,
  "query": {
    "match_all": {}
  }
}

//根据order_date倒序
GET kibana_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc"}], 
  "query": {
    "match_all": {}
  }
}

//只返回order_date字段
GET kibana_sample_data_ecommerce/_search
{
  "_source": ["order_date"], 
  "query": {"match_all": {}}
}

//脚本字段,新增一个new_field字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'_hello'"
      }
    }
  }, 
  "query": {"match_all": {}}
}

//查询包含Last或者包含Christmas
GET movies/_search
{
  "query": {
    "match": {
      "title": "Last Christmas"
    }
  }
  , "profile": "true"
}

//查询即包含Last又包含Christmas
GET movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Christmas Last",
        "operator": "and"
      }
    }
  }
}

//slop 指定中间忽略匹配的数量。搜索出的结果:One I Love, The
GET movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query":"one love",
        "slop": 1
      }
    }
  }
  
}

1,Query String&Simple  Query String

//title包含Homeward和Bound
GET movies/_search
{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "Homeward AND Bound"
    }
  }
}

//title包含Homeward和Bound 或者 包含Lost和in
GET movies/_search
{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "(Homeward AND Bound) or (Lost and in)"
    }
  }
}

//title包含Homeward和Bound 
GET movies/_search
{
  "query": {
    "simple_query_string": {
      "query": "Homeward Bound",
      "fields": ["title"],
      "default_operator": "and"
    }
  }
}

 

2,term查询

terms查询是用于结构化数据的查询。全文用match查询。而bool属于一种复合查询。可以结合terms查询和match查询

GET movies/_search
{
  "query": {
        "term": {
          "title.keyword": {
            "value": "Homeward Bound: The Incredible Journey"
          }
     }
  }
}
//跳过算分,提高性能
GET movies/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "title.keyword": {
            "value": "Homeward Bound: The Incredible Journey"
          }
     }}
    }
  }
}
GET request_audit_logs/_search
{
   "query": {
     "bool": {
       "filter": [
         {"term": {
           "url": "http://localhost:18908/api/User/Login"
         }},
         {
           "match":{
             "request_content":"15607172222"
           }
         },
         {
           "range": {
             "request_time": {
               "gte": "2020-01-01 00:00:00"
             }
           }
         }
       ]
     }
   }
}

 

 

3,Query&Filtering与多字符多字段查询

gte:大等于
lte:小等于
gt:大于
lt:小于

must 必须匹配。贡献算分
should 选择性匹配。贡献算分
must_not

Filter Context

查询字句,必须不能匹配

filter

Filter Context

必须匹配,但不贡献算分

GET movies/_search
{
  "query": {
    "bool": {
      "must": {"term": {"year":"1960"}},
      "filter": {"term":{"title.keyword":"Pollyanna"}},
      "must_not":{"range":{"year":{"lte":1961}}},
      "should": [
        {"term":{"genre.keyword": "Children"}},
        {"term":{"genre.keyword": "Comedy"}}
      ]
    }
  }
}
//title中包含The并且不包含Good
GET movies/_search
{
  
  "query": {
    "bool": {
      "must": [{"match": {"title": "The"}}],
      "must_not": [{"match": {"title": "Good"}}]
    }
  }
}

 

//将title中包含The的语句排在靠前,包含Grifters排在靠后
GET movies/_search
{
  "query": {
    "boosting": {
      "positive": {"match": {
        "title": "The"
      }},
      "negative": {"match": {
        "title": "Grifters"
      }},
      "negative_boost": 0.5
    }
    
  }
}

 

4,单字符串多字段查询:Dis Max Query

//1,获取最佳匹配语句的评分_score
//2,将其他匹配语句的评分与tie_breaker相乘
//3,对以上评分求和并规范
//tie_breaker是一个介于0-1之间的浮点数。0代表使用最佳匹配;1代表所有语句同等重要
POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0
        }
    }
}

 

5,单字符串多字段查询:Mult Match

最佳字段(Best Fields):当字段之间相互竞争,有相互关联。例如title和body这样的字段。评分来自最匹配字段

多数字段(Most Fields):处理英文内容时:一种常见的手段是,在主字段(English Analyzer),抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号。匹配字段越多则越好

混合字段(Corss Fields):对于某些实体,例如人名、地址、图书信息。需要在多字字段中确定信息,单个字段只能作为整理的一部分。希望在任何这些列出的字段中找到尽可能多的词

POST blogs/_search
{
  "query": {
    "multi_match": {
      "type": "best_fields",
      "query": "Quick pets",
      "fields": ["title","body"],
      "tie_breaker": 0.2,
      "minimum_should_match": "20%"
    }
  }
}
//英文分词器可以提高算分值,标准分词器可以提高精度
POST titles/_bulk
{ "index": { "_id": 1 }}
{ "title": "My dog barks" }
{ "index": { "_id": 2 }}
{ "title": "I see a lot of barking dogs on the road " }
PUT /titles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "english",
        "fields": {"std": {"type": "text","analyzer": "standard"}}
      }
    }
  } 
}
GET /titles/_search
{
   "query": {
        "multi_match": {
            "query":  "barking dogs",
            "type":   "most_fields",
            "fields": [ "title", "title.std" ]
        }
    }
}
GET /titles/_search
{
   "query": {
        "multi_match": {
            "query":  "barking dogs",
            "type":   "cross_fields",
            "operator": "and", 
            "fields": [ "title", "title.std" ]
        }
    }
}

 

 6,Search Template与 Index Alias

//删除搜索模版
DELETE _scripts/tmdb
//设置搜索模版
POST _scripts/tmdb
{
  "script":{
    "lang": "mustache",
    "source": {
      "_source":["title"],
    "size":20,
     "query":{
       "bool": {
         "must": [
           {"term": {
              "title.keyword":"{{q}}"
          }}
         ]
       }
     }
    }
  }
  
}
//使用搜索模版
POST movies/_search/template
{
  "id":"tmdb",
  "params": {
    "q":"Lamerica"
  }
}

//删除别名
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "movies",
        "alias": "movies2"
      }
    }
  ]
  
}
//设置别名
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "movies",
        "alias": "movies2"
      }
    }
  ]
}
//使用别名查询
GET movies2/_search

 

 7,Function Score Query优化算分

//fields算分度 * votes
POST /blogs/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field": "votes"
      }
    }
  }
}

//log(fields算分度 * votes)
POST /blogs/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field": "votes",
        "modifier": "log1p"
      }
    }
  }
}

 

 8,Term Suggester与Phrese Suggester

missing 如索引中已经存在,就不建议提供

popular 推荐出现频率更加高的词

always 无论是否存在,都提供建议

POST /articles/_search
{
  "size": 1,
  "query": {
    "match": {
      "body": "lucen rock"
    }
  },
  "suggest": {
    "term": {
      "text": "lucen rock",
      "term": {
        "suggest_mode": "missing",
        "field": "body"
      }
    }
  }
}

phrase多增加了几个参数

max_errors 最多可以拼错的terms数

confidence 限制返回的结果数

POST /articles/_search
{
  "suggest": {
    "my-suggestion": {
      "text": "lucne and elasticsear rock hello world ",
      "phrase": {
        "field": "body",
        "max_errors":2,
        "confidence":0,
        "direct_generator":[{
          "field":"body",
          "suggest_mode":"always"
        }],
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        }
      }
    }
  }
}

 

9,自动补全与基于上下文的提示

Search Api
DELETE articles
//设置mapper
PUT articles
{
  "mappings": {
    "properties": {
      "title_completion":{
        "type": "completion"
      }
    }
  }
}

POST articles/_bulk
{ "index" : { } }
{ "title_completion": "lucene is very cool"}
{ "index" : { } }
{ "title_completion": "Elasticsearch builds on top of lucene"}
{ "index" : { } }
{ "title_completion": "Elasticsearch rocks"}
{ "index" : { } }
{ "title_completion": "elastic is the company behind ELK stack"}
{ "index" : { } }
{ "title_completion": "Elk stack rocks"}
{ "index" : {} }


POST articles/_search?pretty
{
  "size": 0,
  "suggest": {
    "article-suggester": {
      "prefix": "elk",
      "completion": {
        "field": "title_completion"
      }
    }
  }
}

GET comments/_search
DELETE comments
PUT comments
//设置mapper,多了contexts
PUT comments/_mapping
{
  "properties": {
    "comment_autocomplete":{
      "type": "completion",
      "contexts":[{
        "type":"category",
        "name":"comment_category"
      }]
    }
  }
}

POST comments/_doc
{
  "comment":"I love the star war movies",
  "comment_autocomplete":{
    "input":["star wars"],
    "contexts":{
      "comment_category":"movies"
    }
  }
}

POST comments/_doc
{
  "comment":"Where can I find a Starbucks",
  "comment_autocomplete":{
    "input":["starbucks"],
    "contexts":{
      "comment_category":"coffee"
    }
  }
}


POST comments/_search
{
  "suggest": {
    "MY_SUGGESTION": {
      "prefix": "sta",
      "completion":{
        "field":"comment_autocomplete",
        "contexts":{
          "comment_category":"coffee"
        }
      }
    }
  }
}
View Code

相关文章: