elasticsearch检索方式

248 阅读2分钟
  1. query String search
  2. query SDL
  3. query filter
  4. full-text search
  5. phrase search
  6. highlight search

一、query String search

搜索全部type下的document:GET /index/type/_search

搜索出以下参数:

took:耗费了几毫秒

time_out:是否超时

_shards:数据拆成5个分片,所以对所有的请求,会打到所有的primary shard或者replica shard上

hits.total:查询结果的数量

hit.max_score:score就是一个document对于一个search的相关度的匹配分数,越相关就越匹配,分数也就越高

hit.hits:包含了匹配出来的document的详细数据

query String search的由来:因为search参数都是以HTTP请求的query string来附带的

还可以按照具体的field来查询并排序:GET /index/type/_search?q=name:zhangsan&sort=age:desc

适用于临时的在命令行使用一些工具,比如curl,快速的发出请求检索信息,但是如果查询请求很复杂的话,很难去构建这种语句在生产环境中,所以很少用query string search

二、query DSL

DSL:domain specified language,特定领域的语言

HTTP request body:请求体可以用json格式来构建查询语法,可以构建各种复杂的查询语句,比query string search强大的多

1、查询所有

GET /index/type/_search {

       “query”:{“match_all”:{}}

}

2、按照某一field查询,并按某一个field排序

GET /index/type/_search {

       “query”:{

                 match:{

                          “name”:“张三”

                  }

        },

        “sort”:[

               {“age”:“desc”}

        ]

}

3、分页查询,from:从哪一个开始查,size:查几个

GET /index/type/_search {

       “query”:{“match_all”:{}},

       “from”:1,

       “size”:1

}

4、查询指定的field

GET /index/type/_search {

       “query”:{“match_all”:{}},

       “_source”:[“name”,“age”]

}

三、query filter

搜索包含某一个field,并且按照某一个field进行过滤

GET /index/type/_search {

      “query”:{

                 “bool”:{

                         “must”:{

                                  “match”:{

                                             “name”:“张三”

                                   }

                         },

                         “filter”:{

                                “range”:{

                                           “age”:{“gt”:25}

                                 }

                          }

                  }

      }

}

四、full-text search(全文索引)

GET /index/type/_search {

      “query”:{

               “match”:{

                         “description”:“I am a doctor”

               }

     }

会先对“I am a doctor”进行拆分处理,“I”,“am”,“a”,“doctor”

5、phrase search(短语搜索)

跟全文索引正好相反,全文索引会将输入的搜索字符串拆分,去倒排索引里面进行一一匹配,只要能匹配上任意一个拆解的单词,就可以作为返回结果,但是phrase search要求输入的搜索串,必须和要搜索的document里面的字段文本一模一样才算匹配成功,作为返回结果。

GET /index/type/_search {

      “query”:{

               “match_phrase”:{

                            “description”:“I am a doctor”

              }

      }

}

6、highLight search(高亮搜索结果)

GET /index/type/_search {

       “match”:{

                  “name”:“zhangsan”

      }

      “highlight”:{

                    “fileds”:{

                             “name”:{}

                    }

      }

}