Query API:
Query DSL:JSON based language for building complex queries
用于实现诸多类型的查询操作,比如,simple term query,phrase ,range boolean,fuzzy等
ES的查询操作执行分为两个阶段:
分散阶段:
合并阶段:
查询方式:
向ES发起查询请求的方式有两种 :
1.通过Restful request API查询,也称为query string;
[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty'
2.通过发送REST request body进行;
[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '
> {
> "query":{ "match_all":{} }
> }'
多索引、多类型查询:
/_search: 所有索引;
/INDEX_NAME/_search: 单索引
/INDEX1,INDEX2/_search: 多索引
/s*,t*/_search: 所有s,t开头的索引
/students/class1/_search: 单类型搜索
/students/class1,class2/_search: 多类型搜索
Mapping和Analysis:
ES:对每一个文档,会取得其所有域的所有值,生成一个名为"_all"的域;执行查询时,如果在query_string未指定查询的域,则
在_all域上执行查询操作;
GET /_search?q="Xianglong"
GET /_search?q="Xianglong shiba zhang"
GET /_search?q=courses:"Xianglong shiba zhang"
GET /_search?q=courses:"Xianglong"
前两个表示在_all域搜索
后两个表示在指定的域上搜索
数据类型: string, numbers,boolean,dates
查看指定类型的mapping示例:
[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_mapping/class1?pretty'
ES中搜索的数据广义上可被理解为两类:
types: exact
full-text
精确值:指未经加工的原始值;在搜索时进行精确匹配;
full-text:用于引用文本中数据; 判断文档在多大程度上匹配查询请求;即评估文档与用户请求查询的相关度;
为了完成full-text搜索,ES必须首先分析文本,并创建出倒排索引;倒排索引中的数据还需要“正规化”为标准格式;
分词
正规化
即分析
分析需要由分析器进行: analyzer,
分析器由三个组件构成: 字符过滤器,分词器、分词过滤器
ES内置的分析器:
standard analyzer:
simple analyzer
whitespace analyzer
language analyzer
分析器不仅在创建过引时用到;在构建查询时也会用到;
Query DSL:
request body:
分成两类:
query dsl: 执行full-text查询时,基于相关度来评判其区配结果;
查询执行过程复杂,且不会被缓存;
filter dsl:执行exact查询时,基于其结果为“yes”或"no"进行评判;
速度快,且结果缓存;
filter dsl:
term filter: 精确匹配包含指定term的文档;
查询语句结构:
{
QUERY_NAME:{
AGGUMENT:VALUE,
AGGUMENT:VALUE,...
}
}
{
QUERY_NAME:{
FIELD_NAME: {
ARGUMENT: VALUE,...
}
}
}
示例:
[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '{
> query:{
> "term":{"name":"Guo"}
> }
> }'
{
"took" : 49,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
terms filter: 用于多值精确匹配
{ "terms":{"name":["GUO","Rong"]}}
range filters:用于在指定的范围内查找数值或时间。
{ "range":
"age":{"gte":15,
"lte":25
}
}
exists and missing filters:
{"exists":{
"age":25
}
}
boolean filter:
基于boolean的逻辑来合并多个filter子句:
must: 其内部所有的子句条件必须同时匹配,即and:
must:{
"term":{"age":25}
"term":{"gender":"Female"}
}
must_not: 其所有子句必须不匹配,即not
should: 至少有一个子句匹配,即or
QUERY DSL:
match_all Query:
用于匹配所有文档,没有指定任何query,默认即为match_all query.
{"match_all":{}}
match Query:
在几乎任何域上执行full-text或exact-value 查询
如果执行full-text查询,首先对查询时的语句做分析;
{“match”:{"students":"Guo"}}
如果执行exact-value查询,搜索精确值,此时,建议使用过滤,而非查询;
{"match": {"name":"Guo"}}
multi_match Query:
用于在多个域上执行相同的查询:
{
“multi_match”:
"query": full-text search
"filed":{"filed1","filed2"}
}
{
"multi_match":
"query":{
"students":"Guo"
}
"filed":{
"name",
"description"
}
}
bool query:
基于boolean逻辑合并多个查询语句: 与bool filter不同的是,查询子句不是返回"yes"或"no",而是其计算出的匹配度分值。
因此,boolean query会为各子句合并其score:
合并filter和query:
{
"filterd":{
query:{"match":{"gender":"Female"}}
filter:{"term":{"age"}:25}}
}
}
查询语句语法检查:
GET /INDEX/_validate/query?explain&pretty
{
......
}
原文地址:http://blog.51cto.com/limingyu/2116915