search的timeout
- 设置:默认没有timeout,如果设置了timeout,那么会执行timeout机制。
- Timeout机制:假设用户查询结果有1W条数据,但是需要10s才能查询完毕,但是用户设置了1s的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
- 用法:GET /_search?timeout=1s/ms/m
在返回值中, 如果是 "timed_out" : false, 说明没有超时, 返回的是全量数据
Query_string 一般不用于生产环境
- 查询所有:GET /product/_search
- 带参数:GET /product/_search?q=name:xiaomi
- 分页:GET /product/_search?from=0&size=2&sort=price:asc
Query DSL
match_all:匹配所有
GET /product/_search
{
"query":{
"match_all": {}
}
}
match:会分词, 各个词之间是or的关系 -> name中包含“nfc” 或者 包含"phone"
GET /product/_search
{
"query": {
"match": {
"name": "nfc phone"
}
}
}
sort:按照价格倒序排序 一旦有了sort, es为了提升性能, 就不会去算score, 因为没有必要
GET /product/_search
{
"query": {
"multi_match": {
"query": "nfc",
"fields": ["name","desc"]
}
},
"sort": [
{
"price": "desc"
}
]
}
multi_match:根据多个字段查询一个关键词,name和desc中包含“nfc”的doc
GET /product/_search
{
"query": {
"multi_match": {
"query": "nfc",
"fields": ["name","desc"]
}
},
"sort": [
{
"price": "desc"
}
]
}
_source 元数据:想要让返回的字段少一些, 可以用这个
GET /product/_search
{
"query":{
"match": {
"name": "nfc"
}
},
"_source": ["name","price"]
}
分页:查询第一页(每页两条数据), 但是要注意deep-paging问题
GET /product/_search
{
"query":{
"match_all": {}
},
"sort": [
{
"price": "asc"
}
],
"from": 0,
"size": 2
}
Full-text queries:全文检索
term:不会被分词
GET /product/_search
{
"query": {
"term": {
"name": "nfc"
}
}
}
"hits" : [ {
"_score" : 0.90928507,
"_source" : {
"name" : "nfc phone"
}
}, {
"_score" : 0.76209855,
"_source" : {
"name" : "xiaomi nfc phone"
}
}
]
match和term区别:
# 这里因为没有分词,所以从倒排索引中查询 "nfc phone" 没有结果
GET /product/_search
{
"query": {
"term": {
"name": "nfc phone"
}
}
}
# name中既要有nfc, 又必须有phone
GET /product/_search
{
"query": {
"bool": {
"must": [
{"term":{"name":"nfc"}},
{"term":{"name":"phone"}}
]
}
}
}
{
"_score" : 1.4691012,
"_source" : {
"name" : "nfc phone"
}
}, {
"_score" : 1.2312969,
"_source" : {
"name" : "xiaomi nfc phone"
}
}
# name中要有nfc 或者 要有phone
GET /product/_search
{
"query": {
"terms": {
"name":["nfc","phone"]
}
}
}
{
"_score" : 1.0,
"_source" : {
"name" : "xiaomi phone"
}
}, {
"_score" : 1.0,
"_source" : {
"name" : "xiaomi nfc phone"
}
}, {
"_score" : 1.0,
"_source" : {
"name" : "nfc phone"
}
}
# match会分词, 词与词之间的关系是or
GET /product/_search
{
"query": {
"match": {
"name": "nfc phone"
}
}
}
{
"_score" : 1.4691012,
"_source" : {
"name" : "nfc phone"
}
}, {
"_score" : 1.2312969,
"_source" : {
"name" : "xiaomi nfc phone"
}
}, {
"_score" : 0.5598161,
"_source" : {
"name" : "xiaomi phone"
}
}
☆全文检索
GET /product/_search
{
"query": {
"match": {
"name": "xiaomi nfc zhineng phone"
}
}
}
#验证分词
GET /_analyze
{
"analyzer": "standard"
,"text": "xiaomi nfc zhineng phone"
}
返回
"tokens" : [
{
"token" : "xiaomi",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
}, {
"token" : "nfc",
"start_offset" : 7,
"end_offset" : 10,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "zhineng",
"start_offset" : 11,
"end_offset" : 18,
"type" : "<ALPHANUM>",
"position" : 2
}, {
"token" : "phone",
"start_offset" : 19,
"end_offset" : 24,
"type" : "<ALPHANUM>",
"position" : 3
}
]
phrase search:短语搜索,和全文检索相反,“nfc phone”会作为一个短语去检索
# nfc和phone必须同时包含
GET /product/_search
{
"query": {
"match_phrase": {
"name": "nfc phone"
}
}
}
Query and filter:查询和过滤
bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值
bool下的多个查询条件, 是AND的关系
score | cache | ||
---|---|---|---|
must 必须满足 |
计算 | 子句(查询)必须出现在匹配的文档中, AND: 子句全都要满足 | |
filter 过滤器 |
不计算 | 缓存 | 子句(查询)必须出现在匹配的文档中。但是不像 |
should 或 |
计算 | 子句(查询)应出现在匹配的文档中 minimum_should_match: 1 OR: 子句至少满足一个 |
|
must_not 必须不满足 |
不计算 | 缓存 | 子句(查询)不得出现在匹配的文 |