内容简介:在个人的实践中,ElasticSearch是充当关系型数据库来使用,将Mysql中数据过大的超过1000w的表存入ES中,所以使用的全部是确切词查询而非全文检索,因此在本次ES的学习中忽略了与全文检索相关如得分等相关特性,这些在后续的有关搜索引擎的实践中会介绍。在这张脑图中主要介绍的是搜索相关的一些机制。下面会对该图做一些简单的说明。前文说过ES的操作都是基于JSON来控制的,那么不管是简单的查询还是复杂的查询ES都是通过不同的JSON对象来实现的。
在个人的实践中,ElasticSearch是充当关系型数据库来使用,将 Mysql 中数据过大的超过1000w的表存入ES中,所以使用的全部是确切词查询而非全文检索,因此在本次ES的学习中忽略了与全文检索相关如得分等相关特性,这些在后续的有关搜索引擎的实践中会介绍。
在这张脑图中主要介绍的是搜索相关的一些机制。下面会对该图做一些简单的说明。
简单查询
前文说过ES的操作都是基于JSON来控制的,那么不管是简单的查询还是复杂的查询ES都是通过不同的JSON对象来实现的。
这里只是简单的说明,通过脑图方便记忆,具体的操作可以看 ElasticSearch—— Java API
查询过程
-
查询逻辑
- 发散阶段:
- 收集阶段:
-
搜索类型
查询执行的顺序,方式等,默认的是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指定
http://localhost:9200/index/_search?preference=_primary 复制代码
只在主分片上执行搜索,不使用副本。当想使用索引中最近更新的、还没复制到副本 中的信息,这个是很有用的。
基本查询
ES中的查询分很多种类,这边说明几种常见的使用方式
-
词条查询
它仅匹配在给定字段中含有该词条的文档,而 且是确切的、未经分析的词条
{ "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中的">","<",">=","<="
复合查询
复合查询就是支持可以把多个查询连接起来,或者改变其他查询的行为。
-
布尔查询
复合查询就是支持可以把多个查询连接起来,或者改变其他查询的行为 主要有如下几种连接符。
- must :被它封装的布尔查询必须被匹配,文档才会返回 类似"and"
- should :被它封装的布尔查询可能被匹配,也可能不被匹配 类似"or"
- must_not:被它封装的布尔查询必须不被匹配,文档才会返回 类似 "!="
{ "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的文档。
常见过滤器
- term过滤器
- terms过滤器
- and过滤器
- or过滤器
- bool过滤器 ······
未完待续!!!!!!
以上所述就是小编给大家介绍的《ElasticSearch——搜索机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 海量数据搜索---搜索引擎
- 海量数据搜索——搜索引擎
- excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史
- 深度优先搜索和广度优先搜索
- 图解:深度优先搜索与广度优先搜索
- GitLab 搜索利器,代码搜索工具 Kooder 发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
软件框架设计的艺术
[捷] Jaroslav Tulach / 王磊、朱兴 / 人民邮电出版社 / 2011-3 / 75.00元
本书帮助你解决API 设计方面的问题,共分3 个部分,分别指出学习API 设计是需要进行科学的训练的、Java 语言在设计方面的理论及设计和维护API 时的常见情况,并提供了各种技巧来解决相应的问题。 本书作者是NetBeans 的创始人,也是NetBeans 项目最初的架构师。相信在API 设计中遇到问题时,本书将不可或缺。 本书适用于软件设计人员阅读。一起来看看 《软件框架设计的艺术》 这本书的介绍吧!