ElasticSearch多种搜索方式
一,query string search 搜索
GET /ecommerce/product/_search
搜索商品名称中包含牙膏的商品,而且按售价降序排序:
GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息,但是如果查询请求很复杂,是很难去构建的 在生产环境中,几乎很少使用
query string search took:耗费了几毫秒
time_out:是否超时
_shards:由于把数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,几个document
hits.max_score:score 就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高 hits.hits:包含了匹配搜索的document的详细数据
二,query DSL
DSL(Domain Specifies Langguage)特定领域的语言 http request body:请求体,可以用json的格式来构建查询语言,比较方便,可以构建各种复杂的语法,比query string search
GET /ecommerce/product/_search
{ "query":
{
"match_all":{}
}
}
查询名称包含yagao的商品,同时按照价格降序排序
GET /ecommerce/product/_search
{ "query":{
"match":
{
"name":"yagao"
}
}, "sort":[ {"price":"desc"} ]
}
分页查询商品,总共三条商品,假设每页就显示一条商品,现在显示第二页,所以就查出来 第二个商品
GET /ecommerce/product/_search
{ "query":
{
"match_all":{}
},
"from":1,
"size":2
}
指定要查询出来商品的名称和价格就可以
GET /ecommerce/product/_search
{ "query":
{
"match_all":{}
},
"_source":["name","price"]
}
更加适合生产环境的使用,可以构建复杂的查询
三,query filter 搜索
商品名称包含yagao,而且售价大于25元的商品
GET /ecommerce/product/_search
{ "query":
{ "bool":
{ "must":
{ "match":
{ "name":"yagao"
}
},
"filter":
{ "range":
{ "price":
{"gt":25}
}
}
}
}
}
四,full-text search (全文检索)
GET /ecommerce/product/_search
{ "query":
{ "match":
{ "producer":"yagao producer" }
}
}
producer这个字段,会先被拆解,建立倒排索引
special 4
yagao 4
producer 1 2 3 4
gaolujie 1
zhonghua 3
jiajieshi 2
当 yagao producer---->yagao和producer
五,phrase search(短语搜索)
跟全文检索相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回 phrase search:要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算是匹配,才能作为结果返回。
GET /ecommerce/product/_search
{ "query":
{ "match_phrase":
{ "producer":"yagao producer"}
}
}
六,highlight search (高亮搜索)
GET /ecommerce/product/_search
{ "query":
{ "match_phrase":
{ "producer":"yagao producer" }
},
"highlight":
{ "fields":
{ "producer":{}
}
}
}