• ElasticSearch的 Query DSL 和 Filter DSL


    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询。 

    Query DSL 与 Filter DSL


    DSL查询语言中存在两种:查询DSL(query DSL)和过滤DSL(filter DSL)。

    query DSL

    在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

    如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。

    查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。

    一些query的场景:

    • 与full text search的匹配度最高
    • 包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词
    • 包含quick、brown、fox。这些词越接近,这份文档的相关性就越高

    filter DSL

    在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”

    答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

    过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter

    另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

    一些过滤的情况:

    • 创建日期是否在2013-2014年间?
    • status字段是否为published?
    • lat_lon字段是否在某个坐标的10公里范围内?

    参考: http://www.cnblogs.com/xing901022/p/4975931.html 

    下图的查询就是一个组合查询, 既有 filter 也有 query:

    image

    http://xiaorui.cc/2015/11/09/elasticsearch%E7%9A%84%E6%9F%A5%E8%AF%A2%E5%99%A8query%E4%B8%8E%E8%BF%87%E6%BB%A4%E5%99%A8filter%E7%9A%84%E5%8C%BA%E5%88%AB/  

    上面文章提供了一个测试例子。

    • query语句查询结果,第一次查询用了300ms,第二次用了280ms.
    • filter查询出来的结果,第一次查询时间是280ms,第二次130ms。

    具体如何写 查询和 过滤并存的请看下面这篇文章:

    查询与过滤条件的合并 
    http://es.xiaoleilu.com/054_Query_DSL/75_Queries_with_filters.html

    比如说我们有这样一条查询语句,获取右键内容中带“business opportunity”  的:


        "match": { 
            "email": "business opportunity" 
        } 
    }

    然后我们想要让这条语句加入 term 过滤,只在收信箱中匹配邮件:


        "term": { 
            "folder": "inbox" 
        } 
    }

    search API中只能包含 query 语句,所以我们需要用 filtered 来同时包含 "query" 和 "filter" 子句:


        "filtered": { 
            "query":  { "match": { "email": "business opportunity" }}, 
            "filter": { "term":  { "folder": "inbox" }} 
        } 
    }

    我们在外层再加入 query 的上下文关系: 

    GET /_search 

        "query": { 
            "filtered": { 
                "query":  { "match": { "email": "business opportunity" }}, 
                "filter": { "term": { "folder": "inbox" }} 
            } 
        } 

    更多参考: http://es.xiaoleilu.com/054_Query_DSL/75_Queries_with_filters.html 

    参考:

    http://www.fanli7.net/a/bianchengyuyan/C__/20150526/501179.html

  • 相关阅读:
    flex+spring3.0+blazds 数据推送整理版
    深入理解java虚拟机学习笔记1.
    一个netty序列化引起的思考。
    万年历
    面试理论题
    EF之Database First
    20120902 09:29 SQL、LINQ、Lambda 三种用法
    内容漂浮在图片上(div漂浮)
    生成订单号
    时间对比
  • 原文地址:https://www.cnblogs.com/-flq/p/9511930.html
Copyright © 2020-2023  润新知