ElasticSearch 搜索

2020-04-17 16:03:48来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

ElasticSearch 搜索

 

ES有2种搜索方式

  • term系列
  • match系列

 

 

term系列搜索

term

POST 192.168.1.9:9200/mall/_search
{
"query":{
    "term":{
        "goods_name":"苹果"
    }
 }
}

匹配机制是equals,指定字段的值要相等才算匹配,返回所有匹配的document。

如果是float这种数值型,10.0、10是equals的,也算匹配的。

 

 

terms

POST 192.168.1.9:9200/mall/_search
{
"query":{
    "terms":{
        "goods_name":["桃子","梨子"]
    }
 }
}

数组,只要该字段的值是数组中的任意一个元素,就认为该文档匹配。

 

 

不管是term、还是terms,都只支持一个字段,不能使用多个字段进行查询。

 

 

分析一下返回的数据

{
    "took": 2,  #took是take的过去式,搜索花费的时间,ms
    "timed_out": false,  #本次搜索是否超时
    "_shards": {  #分片信息
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {  
            "value": 2,  #匹配的document的数量
            "relation": "eq"  #关系是匹配
        },
        "max_score": 1.0,  #最大的socre,ES会给每个document分配一个score,搜索结果按score升序排列
        "hits": [
            {
                "_index": "mall",  #index
                "_type": "_doc",  #type
                "_id": "2",  #document的id
                "_score": 1.0,  #score
                "_source": {  #数据
                    "goods_name": "桃子",
                    "goods_price": 3.0,
                    "goods_description": "新鲜桃子,3元一斤"
                }
            },
            {
                "_index": "mall",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "goods_name": "梨子",
                    "goods_price": 5.0,
                    "goods_description": "新鲜桃子,5元一斤"
                }
            }
        ]
    }
}

 

 

 

 

match系列搜索

match_all

POST 192.168.1.9:9200/mall/_search
{
"query":{
    "match_all":{
        
    }
 }
}

返回所有的document。match_all里面不能写字段。

 

 

match

POST 192.168.1.9:9200/mall/_search
{
"query":{
    "match":{
        "goods_description":"梨子"
    }
 }
}

如果使用text类型的字段,会进行(拆)分词匹配,比如上面会拆分为"梨"、"子"2个字符,只要商品描述中含有“梨”字或"子"字,就认为该文档匹配。

如果match中写其它类型的字段,比如写keyword类型,那效果和term一样,都是equals 完全匹配。

 

 

multi_match

POST 192.168.1.9:9200/mall/_search
{
 "query": {
    "multi_match": {
        "query":"苹果",
        "fields":["goods_name","goods_descriptioon"]
     }
 }
}

match只能用一个字段来进行匹配,multi_match可以用多个字段来进行匹配。

只要某一个字段匹配了,就认为该文档匹配,字段之间是或的关系。如果该字段是text类型就分词匹配,如果该字段不是text类型就执行完全匹配。

 

 

match_phrase

POST 192.168.1.9:9200/mall/_search
{
 "query": {
    "match_phrase": {
        "goods_description":""
     }
 }
}

效果和match完全相同。

 

 

match_phrase_prefix

POST 192.168.1.9:9200/mall/_search
{
 "query": {
    "match_phrase_prefix": {
        "goods_description":""
     }
 }
}

分词匹配,使用的字段必须是text类型,如果不是text类型会报错。

 

 

 

说明

  • 使用GET、POST均可
  • 返回的是所有匹配的文档
  • 使用哪个字段进行匹配,可以由用户指定,前端给出搜索选项“按标题进行搜索”、“按内容进行搜索”......也可以使用固定的字段进行搜索,比如搜索商品,只按商品名称进行搜索。

     值由用户输入,前端把搜索框的值传递给后台,后台查询ES。

 


原文链接:https://www.cnblogs.com/chy18883701161/p/12720978.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:含泪面试阿里P6凉凉,最终只拿下拼多多主力研发岗

下一篇:【问题管理】-- Struts2配置struts.xml中Action访问报There is n