美文网首页Elasticsearch
Elasticsearch filter查询

Elasticsearch filter查询

作者: 菜花_Q | 来源:发表于2018-04-25 11:30 被阅读2次

    1、fileter查询语句

        优点:

            1、通过filter查询,一样也能拿到我们想要的数据

            2、通过filter可以将数据缓存到内存当中,加快下一次的查询速度

    #建立测试数据_1

    POST /store/products/_bulk

    {"index":{"_id": 1}}

    {"price": 10,"productID": "SD1002136"}

    {"index":{"_id": 2}}

    {"price": 20,"productID": "SD2678421"}

    {"index":{"_id": 3}}

    {"price": 30,"productID": "SD8897573"}

    {"index":{"_id": 4}}

    {"price": 30,"productID": "SD4535233"}

    #查看测试数据

    GET /store/products/_mget

    {

        "ids": ["1","2","3","4"]

    }

    #查看library的mapping信息

    GET /store/_mapping

    #简单过滤查询

    #最简单fileter查询

    #SELECT document FROM products WHERE price = 20

    #filtered 查询价格是20的商品

    GET /store/products/_search

    {

        "query": {

            "filtered": {

                "match_all": {}

            },

            "filter": {

                "term": {

                    "price": 20

                }

            }

        }

    }

    #也可以制定多个值

    GET /store/products/_search

    {

        "query": {

            "filtered": {

                "filter": {

                    "terms": {

                        "price":[ 10,20]

                    }

                }

            }

        }

    }

    #SELECT product FROM products WHERE productID = "SD4535233"

    GET /store/products/_search{

        "query": {

            "filtered": {

                "filter": {

                    "term": {

                        "productID":"SD453233"

                    }

                }

            }

        }

    }

    #返回结果为空?为什么呢?查看 mapping,productID的type是string

    #查看分析器解析的结果

    GET /_analyzer?text=SD4535233

    #分析结果显示式将SD4535233变成了 sd4535233,所以讲上面的查询语句的过滤条件改成sd4535233,就可以搜索到了。

    如果想SD4535233被搜索到。需要重新建立一个映射,让productID处于not_analyzed模式

    DELETE /store

    #重新建立一个映射,让productID处于not_analyzed模式

    PUT /store

    {

        "mappings": {

            "products": {

                "productID": {

                    "type": "string",

                    "index": "not_analyzed"

                }

            }

        }

    }

    #重新导入测试数据

    #再次查询

    #bool过滤查询,可以做组合过滤查询

    #SELECT product FROM products WHERE (price = 20 OR productID = "SD1002136") AND (price !=30)

    #查询价格等于20的或者productID为SD4535233的商品,排除价格30元的。

    #类似的,Elasticsearch也有and,or,not这样的组合条件的查询方式

    #格式如下:

    #{

    # "bool": {

    # "must": [],

    # "should":[],

    # "must_not": [],

    #    }

    #}

    # must: 条件必须满足,相当于and

    # should: 条件可以满足可以不满足,相当于or

    # must_not:条件不需要满足,相当于not

    GET /store/products/_search

    {

        "query": {

            "filterd": {

                "bool":{

                    "should": [

                        {"term":{"price": 20}},

                        {"term":{"productID":"SD1002136"}}

                    ],

                    "must_not": {

                        "term": {"price": 30}

                    }

                }

            }

        }

    }

    #嵌套查询

    #SELECT document FROM products WHERE productID = "SD1002136" OR (productID = "SD4535233" AND price = 30)

    GET /store/products/_search

    {

        "query": {

            "filtered": {

                "filter": {

                    "bool": {

                        "should":[

                            {"term": {"productID":"SD1002136"}},

                            {"bool": {

                                "must": [

                                    {"term":{"productID": "SD4535233"}},

                                    {"term": {"price": 30}}

                                ]

                                }

                            }

                        ]

                    }

                }

            }

        }

    }

    #另外一种 and,or,not查询

    #没有bool,直接使用and,or,not

    #查询价格既是10元,productID又为SD1002136的结果

    GET /store/products/_search

    {

        "query": {

            "filtered":{

                "filter": {

                    "and": [

                    {

                        "term": {

                            "price": 10

                        }

                    },

                    {"term": {

                        "productID": "SD1002136"

                        }

                    }

                    ]

                },

                "query": {

                    "match_all": {}

                }

            }

        }

    }

    #or

    #查询价格是10元或productID是SD4535233的一些商品

    GET /store/products/_search

    {

        "query": {

            "filtered":{

                "filter": {

                    "or": [

                    {

                        "term": {

                            "price": 10

                        }

                    },

                    {"term": {

                        "productID": "SD1002136"

                        }

                    }

                    ]

                },

                "query": {

                    "match_all": {}

                }

            }

        }

    }

    # not

    #查询productID不是SD1002136的商品

    GET /store/product/_search

    {

        "query": {

            "filtered":{

                "filter": {

                    "not":{

                        "term": {

                            "productID": "SD1002136"

                        }

                    }

                },

                "query":{"match_all": {}}

            }

        }

    }

    #range范围过滤

    #SELECT document FROM product WHERE price BETWEEN 20 AND 40

    # gt: > 大于

    # lt: < 小于

    # gte: >=大于等于

    # lte: <=小于等于

    GET /store/product/_search

    {

        "query": {

            "filtered": {

                "filter":{

                    "range": {

                        "price":{

                            "gt":20,

                            "lt":40

                        }

                    }

                }

            }

        }

    }

    #过滤空和非空

    #建立测试数据_2

    POST /test_index/test/_bulk

    {"index": {"_id": "1"}}

    {"tags":{"search"}}

    {"index":{"_id":"2"}}

    {"tags":["search","open_source"]}

    {"index":{"_id":"3"}}

    {"other_field": "some data"}

    {"index":{"_id":"4"}}

    {"tags": null}

    {"index": {"_id":"5"}}

    {"tags": ["search",null]}

    #处理空值的方法

    #SELECT tags FROM test WHERE tags IS NOT NULL

    #SELECT tags FROM test WHERE tags IS NULL

    GET /test_index/test/_search

    {

        "query":{

            "filtered":{

                "filter": {

                    "exists": {"field": "tags"}

                }

            }

        }

    }

    GET /test_index/test/_search

    {

        "query":{

            "filtered": {

                "filtered": {

                    "missing":{"field":"tags"}

                }

            }

        }

    }

    2、cache缓存

    Elasticsearch在执行带有filter查询时,会打开索引的每个segment文件(Lucene是底层文件),然后去判断里面的文档是否符合filter要求。

    注意:旧的segment文件不会变,新来的数据会产生新的segment

    匹配的结果会用一个大型的BigSet数组来存储,这个数组的值只有0 和1 

    匹配:1

    不匹配:0

    BigSet值是存在内存里的,而不是硬盘里,所以速度快

    开启方式:在filter查询语句后面加"_cache":true

    注意:

    Script filters,Geo-filters,Date ranges 这样的过滤方式开启cache无意义

    exists,missing,range,term和terms查询是默认开启cache的

    filter cache缓存执行原理图

    Elasticsearch的底层是Lucene,Lucene的索引是由很多个segment组成,在做filter查询的过程中,会把索引里面的每个segment都打开,打开后,和查询条件进行匹配,匹配的结果会放到名为Bigset的数组(Bigset是一个很大的数组,存储在内存中,只有0和1)中,比如说第一个segment和查询条件匹配,则记为1,如果没匹配上就记为0。index中的segment是不会变的,如果有新的segment只会额外的添加,不会更改原来的segment,因此,你之前匹配的结果也是不会变的。那么有了Bigset数组,再做下一次查询的时候,速度就会提高,因为有缓存

    相关文章

      网友评论

        本文标题:Elasticsearch filter查询

        本文链接:https://www.haomeiwen.com/subject/gucjlftx.html