前言
之前谈过 Elasticsearch 的基本概况,还有服务端和客户端的使用,这一篇该到重点了---查询语句。正所谓--无搜索,无Elasticsearch,至少,我是这么认为的。那么,ES的搜索语句有哪些呢?其实,它们比你想象中的多!
一.全文本查询
1) 例如:查询全部数据,按number顺序排序,并从第11条开始,取10条
GET /demo/_search(为方便展示,除特别表示,以下皆用此样例做请求接口)
{
"query":{
"match_all":{
}
},
"sort":[
{
"number":"asc"
}
],
"from":10,
"size":10
}
2)单字段查询,例子:查询query_field里含有value全部或部分字符串的数据
{
"query":{
"match":{
"query_field":"value"
}
}
}
3)单字段查询,例子:完全匹配value值
{
"query":{
"match_phrase":{
"query_field":"value"
}
}
}
4)多字段模糊匹配查询,例:在country和name两个字段里模糊匹配value值
{
"query":{
"multi_match":{
"query":"value",
"fields":[
"country",
"name"
]
}
}
}
5)语法查询,组合and or 等逻辑词,例:
{
"query":{
"query_string":{
"query":"(China AND Ada) OR 18"
}
}
}
可以指定字段:
{
"query":{
"query_string":{
"query":"Chine OR Ada",
"fields":[
"country",
"name"
]
}
}
}
二。字段级查询
1)字段查询,例:查询age字段为18的数据 (term是完全匹配检索, 要用在不分词的字段上, 如果某个field在映射中被分词了, term检索将不起作用.
所以, 不分词的field, 要在mapping中设置为 false,即 indes ->false )
{
"query":{
"term":{
"age":18
}
}
}
2) terms 检索,terms,相当于多个term检索, 类似于SQL中in关键字的用法, 即在某些给定的数据中检索,例:
{
"query":{
"terms":{
"keyword":[
"Java编程思想",
"Java并发编程的艺术"
]
}
}
}
3)范围查询,例:查age字段大于等于18,小于30的数据
{
"query":{
"range":{
"age":{
"gte":18,
"lt":30
}
}
}
}
三。其他复合查询
1)主要是bool查询,条件有should、must、must_not等,可以组合filter。
例子1:name字段模糊匹配test,或country字段模糊匹配China,并筛选出age字段大于18 的数据
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"test"
}
},
{
"match":{
"country":"China"
}
}
],
"filter":[
{
"range":{
"age":{
"gt":18
}
}
}
]
}
}
}
例子2:在所有数据里(一般默认最多出来10000条,可配置),查询余额大于2万小于3万的数据
{
"query":{
"bool":{
"must":{
"match_all":{
}
},
"filter":{
"range":{
"balance":{
"gte":20000,
"lte":30000
}
}
}
}
}
}
例子3. boost评分权重 - 控制文档的优先级别
通过boost参数, 令满足某个条件的文档的得分更高, 从而使得其排名更靠前.例:
{
"query": {
"bool": {
"must": [
{"match": {"name":"编程秘籍"} }
],
"should": [
{
"match": {
"name": {
"query":"艺术",
"boost":2// 提升评分权重
}
}
}
]
}
}
}
2)多重查询,例:
POST /_msearch
{"index":"my_test1"}
{"query":{"match_all":{}}}
{"index":"my_test2"}
{"query":{"match":{"name":"张三"}}}
3)异步查询,例:
POST /demo_index/_async_search?size=0
{
"sort":[
{
"date":{
"order":"asc"
}
}
],
"aggs":{
"sale_date":{
"date_histogram":{
"field":"date",
"calendar_interval":"1d"
}
}
}
}
至此,关于ES的搜索语句就介绍到这里了,下回该讲讲别的了吧~