ELK Elasticsearch 笔记(三)信息检索与结果过滤

2023-05-16

Elasticsearch 版本 7.6.2

简单检索

1.查询指定索引写的信息。

curl -XGET 'localhost:9200/test/_search?q=user:ZHANGSAN&pretty'

 2.查询所有索引中的信息:

curl -XGET 'localhost:9200/_search?q=user:ZHANGSAN&pretty'

3.查询多个索引的信息

curl -XGET 'localhost:9200/test,pms/_search?q=user:ZHANGSAN&pretty'

 

基本检索

  1. 设置不同字段的排序权重( Kibana Dev Tools) 
    GET /pms/_search?pretty
    {
      "query": {
        "multi_match": {
          "query": "小米",
          "fields": ["name^2","subTitle"]
        }
      }
    }

    在name和subTitle两个字段里查询,name的权重是2,subTitle的权重是1。

  2. 返回指定的字段子集: 
    //通过 _source参数指定返回的检索字段集
    GET /pms/_search?pretty
    {
      "query": {
        "match_all": {}
      },
      "_source": ["id","name","brandName"]
    }
    
    //通过match参数指定字段和检索词,排序后返回指定数量的指定字段的检索集
    GET /pms/_search?pretty
    {
      "query": {
        "match":{
          "name": "小米"
        }
      },
      "sort": [
        {
          "price": {
            "order": "desc"
          }
        }
      ],
      "_source": ["id","name","price"],
      "size": 3
    }
    //match_phrase子句及其应用
    GET /pms/_search?pretty
    {
      "query": {
        "match_phrase":{
         "name": "小米"
        }
      }
    }
    
  3. Term查询、Terms查询、Wildcard通配符查询
    // 含有boost的term查询, term查询表示查询中的此项不再被解析,boost可以提升其重要性
    GET /pms/_search?pretty
    {
      "query": {
        "term": {
          "name": { //name为字段名
            "value": "小米","boost": 2
          }
        }
      }
    }
    
    //  terms的用法
    GET /pms/_search?pretty
    {
      "query": {
        "terms": {
          "name":[  //name为字段名
            "小米",
            "华为"
          ]
        }
      }
    }
    // wildcard通配符查询允许在要查询的内容中使用通配符*和?(*标书任意多个任意字符,?表示一个任意字符)
    GET /pms/_search?pretty
    {
      "query": {
        "wildcard": {
          "name": {
            "value": "?*"
          }
        }
      }
    }

     

  4. Match、Match_all、Match_phrase查询
    //match_all 查询全部 相当于 select * from table
    GET /pms/_search?pretty
    {
      "query": {
        "match_all": {}
      }
    }
    
    // 匹配所有文档并返回 top11-top12,相当于 select * from table limit 10,5
    GET /pms/_search?pretty
    {
      "query": {
        "match_all": {}
      },
      "from": 10,
      "size": 5
    }
    //匹配所有文档并检索结果按指定字段排序,并分页,
    // 相当于 select * from table order by price desc limit 10,5
    GET /pms/_search?pretty
    {
      "query": {
        "match_all": {}
      },
      "sort": [
        {
          "price": {
            "order": "desc"
          }
        }
      ], 
      "from": 10,
      "size": 5
    }
    // match_phrase查询
    GET /pms/_search?pretty
    {
      "query": {
        "match_phrase": {
          "name": {
            "query": "小米8 and 全面屏",
            "slop": 2  // 定义了在查询文本的词项间的间隔词数量
          }
        }
      },
      "_source": ["id","name","price"]
    }
    

     

  5. Query_string查询
    // query_string 查询
    GET /pms/_search?pretty
    {
      "query": {
        "query_string": {
          "query": "keywords:小米^2 +keywords:华为 -brandName:万和",//注意这里的+号和-号前的空格不能省略
          "default_field": "keywords" //查询所作用的默认字段,默认为_all
        }
      },
      "_source": ["id","name","price","keywords"]
    }
    

     

  6. Prefix、Range查询
    // prefix查询,能够找到摸个字段以给定前缀开头的文档。
    GET /pms/_search?pretty
    {
      "query": {
        "prefix": {
          "keywords": {
            "value": "女式"
          }
        }
      },
      "_source": ["id","name","price","brandName","keywords"]
    }
    // range查询
    GET /pms/_search?pretty
    {
      "query": {
        "range": {
          "id": {
            "gte": 10,//大于等于 
            "lte": 20 //小于等于
          }
        }
      },
      "_source": ["id","name","price","brandName","keywords"]
    }

     

  7. More_like_this、Fuzzy查询
    // more_like_this查询得到与所提供的文本相似的文档。这里可以使用的部分参数如下:
    // 1.fields  查询所作用的字段的数组,默认是 _all。
    // 2.like  指明文档应比较的内容。
    // 3.percent_terms_to_match  指明一个文档必须匹配多大比例此项才视为相似,默认30%。
    // 4.min_term_freq  文档中词项出现的最低频次,低于该值的词项将被忽略,默认 2。
    // 5.max_query_terms 文档中词项出现的最高频次,以避免词项被忽视,默认是 无界。
    // 6.min_word_len  指明单个单词的最小长度,低于该值的单词将被忽略,默认是0。
    // 7.max_query_terms  指明在生成的查询中查询词项的最大数目,默认 25。
    // 8.max_word_len  指明单个单词的最大长度,高于该值的单词将被忽视,默认无界。
    // 9.stop_word  指明忽略词集。
    // 10.boost  提升一个查询的权重时使用的权重,默认是1。
    // 11.analyzer 指明用于分析内容的分词器。
    GET /pms/_search?pretty
    {
      "query": {
        "more_like_this": {
          "fields": [
            "name"
          ],
          "like": "女式",
          "min_term_freq": 1,
          "max_query_terms": 12,
          "boost": 2,
          "analyzer": "ik_smart"
        }
      },
      "_source": ["id","name","price","brandName","keywords"]
    }
    
    // fuzzy 查询得到与给定内容相似的所有文档,其查询是基于模糊串并选择其产生的最好的区分词项。
    GET /pms/_search?pretty
    {
      "query": {
        "fuzzy": {
          "name": {
            "value": "小米", 
            "fuzziness": 0.5
          }
        },  
      "_source": ["id","name","price","brandName","keywords"]
    }

     

  8. 跨字段检索
    GET /pms/_search?pretty
    {
      "query": {
        "multi_match": {
          "query": "小米",
          "fields": ["name","subTitle"] // 同时在name ,subTitle两个字段搜索
        }, 
      "_source": ["id","name","price","brandName","keywords"]
    }

     

Filter、复合查询、结果排序

Elasticsearch在执行带有filter的查询时,会打开索引的每个segment段文件,然后去判断里面的文档是否符合该filter要求,并且这个匹配的结果用一个很大的只有两个状态的的数字BitSet来存储,如果一个文档和filter查询匹配,那么其对应的bit位就设置为1,否则设置为0。下次如果面对同样的filter查询,直接使用内存里面的BitSet来进行判断即可,而不需要再打开索引文件的segment文件了,这样就可以大大提高了查询出来的速度。

可见,其主要作用有两点:首先,他能够过来满足条件的部分结果;其次,filter子句可很好地讲数据缓存进内存中,这样可大大加快下一次的检索速度(需要添加_cache参数),因此,建议在可能的情况下尽量使用filter代替一般的查询一边进一步提高效率。

// newStatus==1 && recommandStatus==1 并 按price 范围过滤
// 复合查询选项: must 、 must_not 、 should,可将各个子查询链接起来
// sort 排序
GET /pms/_search?pretty
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "newStatus": {
              "value": "1"
            }
          }
        },
        {
          "term": {
            "recommandStatus": {
              "value": "1"
            }
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "name": "华为"
          }
        }
      ],
      "filter": [
        {
          "range": {
              "price": {
                "gte": 1000,
                "lte": 3000
              }
            }
        }
      ]
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ELK Elasticsearch 笔记(三)信息检索与结果过滤 的相关文章

随机推荐