码迷,mamicode.com
首页 > 其他好文 > 详细

elasticsearch基础操作03

时间:2018-05-16 15:26:29      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:query   filter   

查询数据:

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

{

......

}


elasticsearch基础操作03

标签:query   filter   

原文地址:http://blog.51cto.com/limingyu/2116915

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!