zoukankan      html  css  js  c++  java
  • 007 ES的多种搜索

      关于这篇文档,还是学习网上的,纯属复制,感觉总结的不错。

      方便理解多种搜索方式。

    一、Query String Search(‘Query String’方式的搜索)

    1.搜索全部商品

    GET /shop_index/productInfo/_search
    

      结果:

    {
      "took": 8,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 3,
        "max_score": 1,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "2",
            "_score": 1,
            "_source": {
              "test": "test"
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "zyWpRGkB8mgaHjxk0Hfo",
            "_score": 1,
            "_source": {
              "name": "HuaWei P20",
              "desc": "Expen but easy to use",
              "price": 5300,
              "producer": "HuaWei Producer",
              "tags": [
                "Expen",
                "Fast"
              ]
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "1",
            "_score": 1,
            "_source": {
              "name": "HuaWei Mate8",
              "desc": "Cheap and easy to use",
              "price": 2500,
              "producer": "HuaWei Producer",
              "tags": [
                "Cheap",
                "Fast"
              ]
            }
          }
        ]
      }
    }
    

      说明:

    took:耗费了几毫秒
    timed_out:是否超时,这里是没有
    _shards:数据被拆到了5个分片上,搜索时使用了5个分片,5个分片都成功地返回了数据,失败了0个,跳过了0个
    hits.total:查询结果的数量,3个document
    max_score:就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也越高
    hits.hits:包含了匹配搜索的document的详细数据
    

      

    2.搜索商品名称中包含HuaWei的商品,而且按照售价降序排序:
      下面这种方法也是"Query String Search"的由来,因为search参数都是以http请求的query string来附带的

    GET /shop_index/productInfo/_search?q=name:HuaWei&sort=price:desc
    

      结果:

    {
      "took": 23,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": null,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "zyWpRGkB8mgaHjxk0Hfo",
            "_score": null,
            "_source": {
              "name": "HuaWei P20",
              "desc": "Expen but easy to use",
              "price": 5300,
              "producer": "HuaWei Producer",
              "tags": [
                "Expen",
                "Fast"
              ]
            },
            "sort": [
              5300
            ]
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "1",
            "_score": null,
            "_source": {
              "name": "HuaWei Mate8",
              "desc": "Cheap and easy to use",
              "price": 2500,
              "producer": "HuaWei Producer",
              "tags": [
                "Cheap",
                "Fast"
              ]
            },
            "sort": [
              2500
            ]
          }
        ]
      }
    }
    

      

    二、Query DSL(DSL: Domain Specified Language,特定领域的语言)

    1.说明

      这种方法是通过一个json格式的http request body请求体作为条件,可以完成多种复杂的查询需求,比query string的功能更加强大

    2.搜索所有商品

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match_all": {}
      }
    }
    

      

    3.查询名称中包含HuaWei的商品,并且按照价格降序排列

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match": {
          "name": "HuaWei"
        }
      },
      "sort": [
        {
          "price": {
            "order": "desc"
          }
        }
      ]
    }
    

      

    4.分页查询第二页,每页1条记录

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match_all": {}
      },
      "from": 1,
      "size": 1
    }
    

      注意:
      (1)在实际项目中,如果有条件查询之后再需要分页,不需要单独查询总条数,ES会返回满足条件的总条数,可以直接使用;
      (2)ES的分页默认from是从0开始的;

    5.只查询特定字段,比如:name,desc和price字段,其他字段不需要返回

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match": {
          "name": "HuaWei"
        }
      },
      "_source": ["name","desc","price"]
    }
    

      结果:

    {
      "took": 27,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "zyWpRGkB8mgaHjxk0Hfo",
            "_score": 0.2876821,
            "_source": {
              "price": 5300,
              "name": "HuaWei P20",
              "desc": "Expen but easy to use"
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "price": 2500,
              "name": "HuaWei Mate8",
              "desc": "Cheap and easy to use"
            }
          }
        ]
      }
    }
    

      

    三.Query Filter(对查询结果进行过滤)

    1.查询名称中包含HuaWei,并且价格大于4000的商品记录

    GET /shop_index/productInfo/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "HuaWei"
              }
            }
          ], 
          "filter": {
            "range": {
              "price": {
                "gt": 4000
              }
            }
          }
        }
      }
    }
    

      结果:

    {
      "took": 195,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "zyWpRGkB8mgaHjxk0Hfo",
            "_score": 0.2876821,
            "_source": {
              "name": "HuaWei P20",
              "desc": "Expen but easy to use",
              "price": 5300,
              "producer": "HuaWei Producer",
              "tags": [
                "Expen",
                "Fast"
              ]
            }
          }
        ]
      }
    }
    

      

    四、全文索引(Full-Text Search)

    1.搜索生产厂商字段中包含"HuaWei MateProducer"的商品记录

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match": {
          "producer": "HuaWei MateProducer"
        }
      }
    }
    

      结果:

    {
      "took": 8,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 0.5753642,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "SiUBRWkB8mgaHjxkJHyS",
            "_score": 0.5753642,
            "_source": {
              "name": "HuaWei Mate10",
              "desc": "Cheap and Beauti",
              "price": 2300,
              "producer": "HuaWei MateProducer",
              "tags": [
                "Cheap",
                "Beauti"
              ]
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "name": "HuaWei Mate8",
              "desc": "Cheap and easy to use",
              "price": 2500,
              "producer": "HuaWei Producer",
              "tags": [
                "Cheap",
                "Fast"
              ]
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "zyWpRGkB8mgaHjxk0Hfo",
            "_score": 0.18232156,
            "_source": {
              "name": "HuaWei P20",
              "desc": "Expen but easy to use",
              "price": 5300,
              "producer": "HuaWei Producer",
              "tags": [
                "Expen",
                "Fast"
              ]
            }
          },
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "CSX8RGkB8mgaHjxkV3w1",
            "_score": 0.18232156,
            "_source": {
              "name": "HuaWei nova 4e",
              "desc": "cheap and look nice",
              "price": 1999,
              "producer": "HuaWei Producer",
              "tags": [
                "Cheap",
                "Nice"
              ]
            }
          }
        ]
      }
    }
    

      从以上结果中可以看到:
      id为"SiUBRWkB8mgaHjxkJHyS"的记录score分数最高,表示匹配度最高;
      原因:
      producer分完词之后包括的词语有:
      (1).HuaWei:
      匹配到改词的记录ID:'SiUBRWkB8mgaHjxkJHyS','1','CSX8RGkB8mgaHjxkV3w1','zyWpRGkB8mgaHjxk0Hfo'
      (2).MateProducer:
      匹配到该词的记录ID:'SiUBRWkB8mgaHjxkJHyS'
      由于"HuaWei MateProducer"两次匹配到ID为'SiUBRWkB8mgaHjxkJHyS'的记录,所以该记录的score分数最高。

    五、Phrase Search(短语搜索)

      短语索引和全文索引的区别:
      (1)全文匹配:将要搜索的内容分词,然后挨个单词去倒排索引中匹配,只要匹配到任意一个单词,就算是匹配到记录;
      (2)短语索引:输入的搜索串,必须在指定的字段内容中,完全包含一模一样的,才可以算匹配,才能作为结果返回;
    1.搜索name中包含"HuaWei MateProducer"短语的商品信息

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match_phrase": {
          "producer": "HuaWei MateProducer"
        }
      }
    }
    

      

    六、Highlight Search(搜索高亮显示)

      高亮搜索指的是搜索的结果中,将某些特别需要强调的词使用特定的样式展示出来。

    1.搜索商品名称中包含"Xiao'Mi"的商品,并将搜索的关键词高亮显示

    GET /shop_index/productInfo/_search
    {
      "query": {
        "match": {
          "name": "Xiao'Mi"
        }
      },
      "highlight": {
        "fields": {
          "name": {}
        }
      }
    }
    

      结果:

    {
      "took": 348,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "shop_index",
            "_type": "productInfo",
            "_id": "HiX9RGkB8mgaHjxk4nxC",
            "_score": 0.2876821,
            "_source": {
              "name": "Xiao'Mi 9",
              "desc": "Expen but nice and Beauti",
              "price": 3500,
              "producer": "XiaoMi Producer",
              "tags": [
                "Expen",
                "Beauti"
              ]
            },
            "highlight": {
              "name": [
                "<em>Xiao'Mi</em> 9"
              ]
            }
          }
        ]
      }
    }
    

      

      

  • 相关阅读:
    android的原理,为什么我们不需要太多的剩余内存(转)
    简单制作RPM二进包实例(转)
    电源相关术语
    Linux 查找指定文件并删除
    Linux内核中的内存屏障(转)
    分压、分流原理
    Linux内核入门—— __attribute__ 机制
    如何手工释放linux内存
    多核编程中的负载平衡难题(转)
    linux2.6.26内核中ARM中断实现详解(转)
  • 原文地址:https://www.cnblogs.com/juncaoit/p/11304256.html
Copyright © 2011-2022 走看看