ElasticSearch核心语法使用-ES内功修炼第五篇

“这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

上一篇介绍了ElasticSearch核心基础语法第四篇,本节介绍ElasticSearch核心语法第五篇。

一、dis_max 的使用场景

在搜索时,对搜索条件尽可能多字段的匹配,哪个字段匹配相关度分高,就排在前边。

文档数据如下:

PUT /zoe_article/_doc/1
{   
  "name": "zhangsan",
  "remark":"developer"
}

PUT /zoe_article/_doc/2
{   
  "name": "zhangsan",
  "remark":"java developer"
}

PUT /zoe_article/_doc/3
{   
  "name": "lisi",
  "remark":"java developer"
}

PUT /zoe_article/_doc/4
{   
  "name": "lisi",
  "remark":"python developer"
}
复制代码

输入 "java developer zhangsan" 时,搜索结果如下:

GET /zoe_article/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "name": "zhangsan"
          }
        },
        {
          "match": {
            "remark": "java developer"
          }
        }
      ]
    }
  }
}
复制代码

image.png

二、cross fields 的使用场景

直译为穿过多个字段,就是在多个字段中进行搜索。

搜索条件中的java必须在name或remark字段中匹配,developer也必须在name或remark字段中匹配。

GET /zoe_article/_search
{
  "query": {
    "multi_match": {
      "query": "java developer",
      "fields": [
        "name",
        "remark"
      ],
      "type": "cross_fields",
      "operator": "and"
    }
  }
}
复制代码

三、copy_to 的使用场景

copy_to:将多个字段复制到一个字段中,实现一个多字段组合。

如果在搜索框内输入“电脑”,点击搜索,那么是在商品属性哪个字段内进行数据匹配?如果使用_all做搜索也不合适,有些字段并不匹配,那是否可以在指定哪些字段中进行数据匹配呢?copy_to就可以实现。

如果需要使用copy_to语法,则需要在定义index的时候,手工指定mapping映射策略。

copy_to语法:

PUT /user_address/_mapping
{
  "properties": {
    "provice": {
      "type": "text",
      "analyzer": "standard",
      "copy_to": "address"
    },
    "city": {
      "type": "text",
      "analyzer": "standard",
      "copy_to": "address"
    },
    "street": {
      "type": "text",
      "analyzer": "standard",
      "copy_to": "address"
    },
    "address": {
      "type": "text",
      "analyzer": "standard"
    }
  }
}
复制代码

四、match phrase 的使用场景

match phrase短语搜索,就是搜索条件不分词,代表搜索条件不可分割。

GET /zoe_article/_search
{
  "query": {
    "match_phras": {
      "remark": "java developer"
    }
  }
}
复制代码

五、prefix search 的使用场景

前缀搜索,通常对keyword类型的字段进行搜索,也就是不进行分词的字段。

对title字段进行前缀搜索。

GET /zoe_article/_search
{
  "query": {
    "prefix": {
      "title.keyword": {
        "value": "掘金社区"
      }
    }
  }
}
复制代码

六、搜索推荐的使用场景

image.png

GET /zoe_article/_search
{
  "query": {
    "match_phrase_prefix": {
      "title": {
        "query": "掘金社区",
        "slop": 10,
        "max_expansions": 10
      }
    }
  }
}
复制代码

slop移动次数范围内,前缀匹配(s),max_expansions是用于指定prefix最多匹配多少个term(单词),超过这个数量就不再匹配了。

七、总结

ElasticSearch搜索语法太多了,针对不同的场景基本上都有对应的语法,可以参考官网进行进一步的阅读查询。

欢迎大家关注微信公众号(MarkZoe)互相学习、互相交流。