ElasticSearch——搜索机制

栏目: 数据库 · 发布时间: 5年前

内容简介:在个人的实践中,ElasticSearch是充当关系型数据库来使用,将Mysql中数据过大的超过1000w的表存入ES中,所以使用的全部是确切词查询而非全文检索,因此在本次ES的学习中忽略了与全文检索相关如得分等相关特性,这些在后续的有关搜索引擎的实践中会介绍。在这张脑图中主要介绍的是搜索相关的一些机制。下面会对该图做一些简单的说明。前文说过ES的操作都是基于JSON来控制的,那么不管是简单的查询还是复杂的查询ES都是通过不同的JSON对象来实现的。

在个人的实践中,ElasticSearch是充当关系型数据库来使用,将 Mysql 中数据过大的超过1000w的表存入ES中,所以使用的全部是确切词查询而非全文检索,因此在本次ES的学习中忽略了与全文检索相关如得分等相关特性,这些在后续的有关搜索引擎的实践中会介绍。

ElasticSearch——搜索机制

在这张脑图中主要介绍的是搜索相关的一些机制。下面会对该图做一些简单的说明。

简单查询

前文说过ES的操作都是基于JSON来控制的,那么不管是简单的查询还是复杂的查询ES都是通过不同的JSON对象来实现的。

这里只是简单的说明,通过脑图方便记忆,具体的操作可以看 ElasticSearch—— Java API

查询过程

  • 查询逻辑

    1. 发散阶段:
    2. 收集阶段:
  • 搜索类型

    查询执行的顺序,方式等,默认的是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中的">","<",">=","<="

复合查询

复合查询就是支持可以把多个查询连接起来,或者改变其他查询的行为。

  • 布尔查询

    复合查询就是支持可以把多个查询连接起来,或者改变其他查询的行为 主要有如下几种连接符。

    1. must :被它封装的布尔查询必须被匹配,文档才会返回 类似"and"
    2. should :被它封装的布尔查询可能被匹配,也可能不被匹配 类似"or"
    3. 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——搜索机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件框架设计的艺术

软件框架设计的艺术

[捷] Jaroslav Tulach / 王磊、朱兴 / 人民邮电出版社 / 2011-3 / 75.00元

本书帮助你解决API 设计方面的问题,共分3 个部分,分别指出学习API 设计是需要进行科学的训练的、Java 语言在设计方面的理论及设计和维护API 时的常见情况,并提供了各种技巧来解决相应的问题。 本书作者是NetBeans 的创始人,也是NetBeans 项目最初的架构师。相信在API 设计中遇到问题时,本书将不可或缺。 本书适用于软件设计人员阅读。一起来看看 《软件框架设计的艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具