美文网首页
【elasticsearch】15、query&filterin

【elasticsearch】15、query&filterin

作者: cutieagain | 来源:发表于2020-03-15 21:06 被阅读0次

    query context & filter context

    image.png
    • 高级搜索的功能:支持多想文本输入,针对多个字段进行搜索
    • 搜索引擎一般也提供基于时间,价格等条件的guolv
    • elasticsearch中,有query和filter两种不同的context
      • query contest:相关性算分
      • filter context:不需要算分,可以利用cache获得更好的性能

    条件组合

    • 假设要搜索一本电影,包含了以下一些条件
      • 评论中包含了guitar,用户打分高于3分,同时上映日期要在1993到2000年之间
    • 这个搜索其实包含了3段逻辑,针对不同的字段
      • 评论字段中要包含guitar/用户评分大于3/上映日期需要在给定的范围
    • 同时包含这三个逻辑,并且有比较好的性能?
      • 符合查询:bool query

    bool 查询

    • 一个bool查询,是一个或者多个查询子句的组合
      • 总共包括4种子句,其中2种会影响算分,2种不影响算分
    • 相关性并不只是全文本检索的专利,也适用于yes | no的子句,匹配的子句越多,相关性评分越高。如果多条查询子句被合并为一条符合查询语句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中
    英文 描述
    must 必须匹配,贡献算分
    should 选择性匹配,贡献算分
    must_not filter context,查询子句,必须不能匹配
    filter filter context,必须匹配,但是不贡献算分

    bool查询语法

    • 子查询可以以任意顺序出席那
    • 可以嵌套多个查询
    • 如果你的bool查询中 ,没有must条件,should中必须至少满足一条查询
    image.png

    如何解决结构化查询-“包含而不是相等”的问题

    • 解决方案:增加一个genre count字段进行计数


      image.png
      image.png
    • 从业务角度,按需修改elasticsearch的数据模型


      image.png

    filter context - 不影响算分

    image.png

    bool嵌套

    • 实现了should not的逻辑


      image.png

    查询语句的结构,会对相关度算分产生影响

    • 同一层级下的竞争字段,具有相同的权重
    • 通过嵌套bool查询,可以改变对算分的影响


      image.png

    控制字段的boosting

    • boosting是控制相关度的一种手段
      • 索引,字段或者查询子条件
    • 参数boost的含义
      • 当boost>1时候,打分的相关度相对性提升
      • 当0<boost<1时候,打分的相关度相对性降低
      • 当boost<0时候,贡献负分


        image.png

    not quite not

    • 要求苹果公司的产品信息优先


      image.png

    回顾

    • query context vs filter context
    • bool query - 更多的条件组合
    • 查询结构与相关性算分
    • 如何控制查询的精确度
      • boosting & boosting query

    示例

    POST /products/_bulk
    { "index": { "_id": 1 }}
    { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" }
    { "index": { "_id": 2 }}
    { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" }
    { "index": { "_id": 3 }}
    { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" }
    { "index": { "_id": 4 }}
    { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
    
    
    
    #基本语法
    POST /products/_search
    {
      "query": {
        "bool" : {
          "must" : {
            "term" : { "price" : "30" }
          },
          "filter": {
            "term" : { "avaliable" : "true" }
          },
          "must_not" : {
            "range" : {
              "price" : { "lte" : 10 }
            }
          },
          "should" : [
            { "term" : { "productID.keyword" : "JODL-X-1937-#pV7" } },
            { "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3" } }
          ],
          "minimum_should_match" :1
        }
      }
    }
    
    #改变数据模型,增加字段。解决数组包含而不是精确匹配的问题
    POST /newmovies/_bulk
    { "index": { "_id": 1 }}
    { "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy","genre_count":1 }
    { "index": { "_id": 2 }}
    { "title" : "Dave","year":1993,"genre":["Comedy","Romance"],"genre_count":2 }
    
    #must,有算分
    POST /newmovies/_search
    {
      "query": {
        "bool": {
          "must": [
            {"term": {"genre.keyword": {"value": "Comedy"}}},
            {"term": {"genre_count": {"value": 1}}}
    
          ]
        }
      }
    }
    
    #Filter。不参与算分,结果的score是0
    POST /newmovies/_search
    {
      "query": {
        "bool": {
          "filter": [
            {"term": {"genre.keyword": {"value": "Comedy"}}},
            {"term": {"genre_count": {"value": 1}}}
            ]
    
        }
      }
    }
    
    
    #Filtering Context
    POST _search
    {
      "query": {
        "bool" : {
    
          "filter": {
            "term" : { "avaliable" : "true" }
          },
          "must_not" : {
            "range" : {
              "price" : { "lte" : 10 }
            }
          }
        }
      }
    }
    
    
    #Query Context
    POST /products/_bulk
    { "index": { "_id": 1 }}
    { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" }
    { "index": { "_id": 2 }}
    { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" }
    { "index": { "_id": 3 }}
    { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" }
    { "index": { "_id": 4 }}
    { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
    
    
    POST /products/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "productID.keyword": {
                  "value": "JODL-X-1937-#pV7"}}
            },
            {"term": {"avaliable": {"value": true}}
            }
          ]
        }
      }
    }
    
    
    #嵌套,实现了 should not 逻辑
    POST /products/_search
    {
      "query": {
        "bool": {
          "must": {
            "term": {
              "price": "30"
            }
          },
          "should": [
            {
              "bool": {
                "must_not": {
                  "term": {
                    "avaliable": "false"
                  }
                }
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
    
    
    #Controll the Precision
    POST _search
    {
      "query": {
        "bool" : {
          "must" : {
            "term" : { "price" : "30" }
          },
          "filter": {
            "term" : { "avaliable" : "true" }
          },
          "must_not" : {
            "range" : {
              "price" : { "lte" : 10 }
            }
          },
          "should" : [
            { "term" : { "productID.keyword" : "JODL-X-1937-#pV7" } },
            { "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3" } }
          ],
          "minimum_should_match" :2
        }
      }
    }
    
    
    
    POST /animals/_search
    {
      "query": {
        "bool": {
          "should": [
            { "term": { "text": "brown" }},
            { "term": { "text": "red" }},
            { "term": { "text": "quick"   }},
            { "term": { "text": "dog"   }}
          ]
        }
      }
    }
    
    POST /animals/_search
    {
      "query": {
        "bool": {
          "should": [
            { "term": { "text": "quick" }},
            { "term": { "text": "dog"   }},
            {
              "bool":{
                "should":[
                   { "term": { "text": "brown" }},
                     { "term": { "text": "brown" }},
                ]
              }
    
            }
          ]
        }
      }
    }
    
    
    DELETE blogs
    POST /blogs/_bulk
    { "index": { "_id": 1 }}
    {"title":"Apple iPad", "content":"Apple iPad,Apple iPad" }
    { "index": { "_id": 2 }}
    {"title":"Apple iPad,Apple iPad", "content":"Apple iPad" }
    
    
    POST blogs/_search
    {
      "query": {
        "bool": {
          "should": [
            {"match": {
              "title": {
                "query": "apple,ipad",
                "boost": 1.1
              }
            }},
    
            {"match": {
              "content": {
                "query": "apple,ipad",
                "boost":
              }
            }}
          ]
        }
      }
    }
    
    DELETE news
    POST /news/_bulk
    { "index": { "_id": 1 }}
    { "content":"Apple Mac" }
    { "index": { "_id": 2 }}
    { "content":"Apple iPad" }
    { "index": { "_id": 3 }}
    { "content":"Apple employee like Apple Pie and Apple Juice" }
    
    
    POST news/_search
    {
      "query": {
        "bool": {
          "must": {
            "match":{"content":"apple"}
          }
        }
      }
    }
    
    POST news/_search
    {
      "query": {
        "bool": {
          "must": {
            "match":{"content":"apple"}
          },
          "must_not": {
            "match":{"content":"pie"}
          }
        }
      }
    }
    
    POST news/_search
    {
      "query": {
        "boosting": {
          "positive": {
            "match": {
              "content": "apple"
            }
          },
          "negative": {
            "match": {
              "content": "pie"
            }
          },
          "negative_boost": 0.5
        }
      }
    }
    
    

    相关文章

      网友评论

          本文标题:【elasticsearch】15、query&filterin

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