Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
- 查询所有:查询出所有数据,一般测试用。例如:match_all
- 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
- match_query
- multi_match_query
- 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
- ids
- range
- term
- 地理(geo)查询:根据经纬度查询。例如:
- geo_distance
- geo_bounding_box
- 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
- bool
- function_score
查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
全文检索
match 根据一个字段查询
multi_match 根据多个字段查,字段越多,性能越差
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand", "name", "business"]
}
}
}
等同于
all 是由三个字段copy_to , 推荐下面写法,性能好一些
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩如家",
}
}
}
精确查询
一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:
- term:根据词条精确值查询
GET /indexName/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
- range:根据值的范围查询
GET /indexName/_search
{
"query": {
"range": {
"price": {
"gte": 1000,
"lte": 2000
}
}
}
}
地理查询
geo_bounding_box
查询geo_point值落在某个矩形范围的所有文档
GET /indexName/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": {
"lat": 31.1,
"lon": 121.5
},
"bottom_right": {
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
geo_distance
查询到指定中心点小于某个距离值的所有文档
GET /indexName/_search
{
"query": {
"geo_distance": {
"distance": "15km",
"FIELD": "31.21,121.5"
}
}
}