在我的的实践中,ElasticSearch是充当关系型数据库来使用,将Mysql中数据过大的超过1000w的表存入ES中,因此使用的所有是确切词查询而非全文检索,所以在本次ES的学习中忽略了与全文检索相关如得分等相关特性,这些在后续的有关搜索引擎的实践中会介绍。 sql
在这张脑图中主要介绍的是搜索相关的一些机制。下面会对该图作一些简单的说明。数据库
前文说过ES的操做都是基于JSON来控制的,那么不论是简单的查询仍是复杂的查询ES都是经过不一样的JSON对象来实现的。
这里只是简单的说明,经过脑图方便记忆,具体的操做能够看ElasticSearch—— Java API缓存
查询逻辑bash
搜索类型post
查询执行的顺序,方式等,默认的是query_then_fetch,此方式符合上述的查询逻辑,如今全部分片上面进行查询对文档的排序和分级信息,而后再在相应的分片上面进行查询实际的文档。
还有一些其余的类型如query_and_fetch,dfs_query_and_fetch,dfs_query_then_fetch等等,能够在搜索时进行指定:性能
http://localhost:9200/index/search?pretty=true&search_type=query_and_fetch
复制代码
搜索执行的偏好学习
控制查询发生在主片仍是副本上面,由preference=xxxx指定fetch
http://localhost:9200/index/_search?preference=_primary
复制代码
只在主分片上执行搜索,不使用副本。当想使用索引中最近更新的、还没复制到副本 中的信息,这个是颇有用的。搜索引擎
ES中的查询分不少种类,这边说明几种常见的使用方式spa
词条查询
它仅匹配在给定字段中含有该词条的文档,而 且是确切的、未经分析的词条
{
"query" : {
"term" : {
"title" : "crime"
}
}
}
复制代码
如上上述查询将匹配title字段中含有crime一词的文档。记住,词条查询是未经分析的,所以需 要提供跟索引文档中的词条彻底匹配的词条
而这种方式和传统SQL中的"="(等值)语句效果同样。
多词条查询
词条查询容许匹配单个未经分析的词条,多词条查询能够用来匹配多个这样的词条。
{
"query" : {
"terms" : {
"tags" : [ "novel", "book","hello" ],
"minimum_match" : 1
}
}
}
复制代码
如上,上述查询返回在tags字段中包含一个或两个搜索词条的全部文档。为何?这是由于咱们 把minimum_match属性设置为1;这意味着至少有1个词条应该匹配。若是想要查询匹配全部词 条的文档,能够把minimum_match属性设置为2。
当minimum_match=1时就和SQL中的“in“语句相似了。
范围查询
范围查询使咱们可以找到在某一字段值在某个范围里的文档,字段能够是数值型,也能够是基于字符串的(将映射到一个不一样的Apache Lucene查询),范围查询只能针对单个字段。
{
"query" : {
"range" : {
"year" : {
"gte" : 1700,
"lte" : 1900
}
}
}
}
复制代码
找到year字段从1700到1900的全部图书
相似SQL中的">","<",">=","<="
复合查询就是支持能够把多个查询链接起来,或者改变其余查询的行为。
布尔查询
复合查询就是支持能够把多个查询链接起来,或者改变其余查询的行为 主要有以下几种链接符。
{
"query" : {
"bool" : {
"must" : {
"term" : {
"title" : "crime"
}
},
"should" : {
"range" : {
"year" : {
"from" : 1900,
"to" : 2000
}
}
},
"must_not" : {
"term" : {
"otitle" : "nothing"
}
}
}
}
}
复制代码
找到全部这样的文档:在title字段中含有crime词条,而且year字段能够在 也能够不在1900~2000的范围里,在otitle字段中不能够包含nothing词条。
过滤器是能够在查询的结果中作过滤,好比在不影响最后分数的状况下,选择索引中的某个子集,就可使用过滤器。
通常来讲应该尽量使用过滤器。过滤器不影响评分,而得分计算让搜索变得复杂,并且须要CPU资源。另外一方面,过滤是一种相对简单的操做。因为过滤应用在整个索引的内容上,过滤的结果独立于找到的文档,也独立于文档之间的关系。过滤器很容易被缓存,从而进一步提升过滤查询的总体性能。
过滤器发生在运行查询以前,因此性能比较好,应该尽量的使用过滤器
{
"query": {
"filtered" : {
"query" : {
"match" : {
"title" : "Catch-22"
}
},
"filter" : {
"term" : {
"year" : 1961
}
}
}
}
}
复制代码
在title字段搜索Catch-22并向其添加过滤器表示只要year=1961的文档。
常见过滤器
未完待续!!!!!!