ElasticSearch学习(一)
- ElasticSearch支持2中检索行为。他们都是使用DSL语句来表达检索条件,分别为query(结构化查询)和filter(结构化搜索)
结构化查询
- 结构化查询支持全文检索,会对检索结果进行相关性计算。使用结构化查询,需要传递query参数:
# your_query为{}表示空查询
{ "query": your_query }
MATCH_ALL查询
- match_all查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询:
SELECT * FROM USER;
{ "match_all" : {} }
MATCH查询
- match查询为全文搜索,类似于SQL的LIKE查询:
SELECT * FROM USER WHERE USER_NAME LIKE '%嘉%';
{ "match":{ "USER_NAME":"嘉" } }
# 结果
"hits":[
{ "_source":{ "USER_ID":"20180124", "USER_NAME":"晓嘉", ... } }
]
MULTI_MATCH查询
- multi_match查询可以在多个字段上执行相同的match查询:
{
"multi_match":{
"query":"景",
"fields":["USER_NAME", "LOCATION"]
}
}
RANGE查询
-
range查询能检索出那些段落在指定区间内的文档,类似于SQL的BETWEEN…AND操作
-
range查询允许的操作符有:gt(大于),gte(大于等于),lt(小于),lte(小于等于)
# 查询年龄在18~24岁的用户信息(不包括18)
SELECT * FROM USER WHERE AGE BETWEEN 18 AND 24 AND AGE != 18;
{
"range":{
"AGE":{ "gt":18, "lte":24 }
}
}
TERM查询
- term查询用于精确匹配,可能是数字、时间、布尔。
# 查询用户ID为20180124的用户信息
SELECT * FROM USER WHERE USER_ID = 20180124;
{
"term":{ "USER_ID":20180124 }
}
TERMS查询
- terms查询同term查询,但它允许指定多值匹配,类似于SQL中的IN操作
# 查询用户ID为20180124或20180125的用户信息
SELECT * FROM USER WHERE USER_ID IN (20180124, 20180125);
{
"terms":{ "USER_ID":[20180124, 20180125] }
}
EXISTS查询 和 MISSING查询
- exists查询和missing查询被用于查找那些指定字段中有值和无值的文档,类似于SQL中的 IS NOT NULL 和 IS NULL 操作
SELECT * FROM USER WHERE LOCATION IS NOT NULL
{
"exists":{ "field":"LOCATION" }
}
SELECT * FROM USER WHERE LOCATION IS NULL
{
"missing":{ "missing":"LOCATION" }
}
BOOL查询
-
我们时常需要将多个条件的结构进行逻辑与和或操作。等同于SQL中的 AND 和 OR 操作。这时就应该使用bool子句合并多子句结果
-
bool查询共有3中:must(AND),must_not(NOT),should(OR)
# 查询用户地址在北京和用户名中包含“金”字或用户ID为20180124的用户信息
SELECT * FROM USER WHERE LOCATION = "北京" AND (USER_NAME LIKE "%金%" OR USER_ID = 20180124);
{
"bool":{
"must":{
"term":{ "LOCATION":"北京" }
},
"should":[
{ "term": { "USER_ID":20180124 } },
{ "match": { "USER_NAME":"金" } }
]
}
}
- 可以使用filter语句来使其子句不参与评分过程,减少评分可以有效地优化性能。重写上面的例子:
{
"bool":{
"should":[ { "match": { "USER_NAME":"金" } } ],
"filter":{
"bool":{
"must":{ "term":{ "LOCATION":"北京" } },
"should":[
{ "term": { "USER_ID":20180124 } }
]
}
}
}
}
CONSTANT_SCORE查询
- constant_score查询将一个不变的变量评分应用于所有匹配的文档,他被经常用于你只需要执行一个filter而没有其他查询的情况下。
{
"constant_score":{
"filter":{
"term":{ "USER_ID":20180124 }
}
}
}
- 结构化查询和结构化搜索的区别:
- 结构化查询会进行相关性计算,因此不会缓存检索结果;而结构化搜索会缓存搜索结果,因此具有较高的检索效率,在不需要全文搜索或者其它任何需要影响相关性得分的查询中建议只是用结构化搜索。当然结构化查询和结构化搜索可以配合使用。
_source子句
- 某些时候可能不需要返回文档中的所有字段,这时就可以使用_source子句指定返回需要的字段
# 返回用户ID为20180124的用户名和地址
SELECT USER_NAME, LOCATION FROM USER WHERE USER_ID = 20180124
{
"_source":[ "USER_NAME", "LOCATION" ]
}
sort子句
简单排序
- 在ElasticSearch中,默认会按照相关性进行排序,相关性得分由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回(未参与相关性评分时参数值为1),默认是按 _score 降序排序。
# 将用户查询结构按照年龄升序排序
SELECT * FROM USER ORDER BY AGE ASC
{
"sort":{
"AGE":{ "order":"asc" }
}
}
多级排序
- 当存在多级排序的场景时,结果首先按第一个条件排序,仅当结果集的第一个sort值完全相同时才会按照第二个条件进行排序。
{
"sort":[
{"AGE":{ "order":"asc" } },
{"_score":{ "order":"desc" }}
]
}
字段多值排序
- 当字段值为多值及字段多值排序,ElasticSearch会对数字或日期类型将多值字段转为单值,转化有min、max、avg、sum等4种模式
{
"sort":{
"AGE":{
"order":"asc",
"mode":"min"
}
}
}
分页子句
- 和SQL使用LIMIT关键字返回单page结果的方式相同,ElasticSearch接受from(初始结果数量)和size(应该返回结果数量)参数
{
"size": 10,
"from": 1
}