ElasticSearch核心語法使用-ES內功修煉第五篇

「這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰java

上一篇介紹了ElasticSearch核心基礎語法第四篇,本節介紹ElasticSearch核心語法第五篇。python

1、dis_max 的使用場景

在搜索時,對搜索條件儘量多字段的匹配,哪一個字段匹配相關度分高,就排在前邊。json

文檔數據以下:微信

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" 時,搜索結果以下:markdown

GET /zoe_article/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "name": "zhangsan"
          }
        },
        {
          "match": {
            "remark": "java developer"
          }
        }
      ]
    }
  }
}
複製代碼

image.png

2、cross fields 的使用場景

直譯爲穿過多個字段,就是在多個字段中進行搜索。app

搜索條件中的java必須在name或remark字段中匹配,developer也必須在name或remark字段中匹配。post

GET /zoe_article/_search
{
  "query": {
    "multi_match": {
      "query": "java developer",
      "fields": [
        "name",
        "remark"
      ],
      "type": "cross_fields",
      "operator": "and"
    }
  }
}
複製代碼

3、copy_to 的使用場景

copy_to:將多個字段複製到一個字段中,實現一個多字段組合。學習

若是在搜索框內輸入「電腦」,點擊搜索,那麼是在商品屬性哪一個字段內進行數據匹配?若是使用_all作搜索也不合適,有些字段並不匹配,那是否能夠在指定哪些字段中進行數據匹配呢?copy_to就能夠實現。spa

若是須要使用copy_to語法,則須要在定義index的時候,手工指定mapping映射策略。3d

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"
    }
  }
}
複製代碼

4、match phrase 的使用場景

match phrase短語搜索,就是搜索條件不分詞,表明搜索條件不可分割。

GET /zoe_article/_search
{
  "query": {
    "match_phras": {
      "remark": "java developer"
    }
  }
}
複製代碼

5、prefix search 的使用場景

前綴搜索,一般對keyword類型的字段進行搜索,也就是不進行分詞的字段。

對title字段進行前綴搜索。

GET /zoe_article/_search
{
  "query": {
    "prefix": {
      "title.keyword": {
        "value": "掘金社區"
      }
    }
  }
}
複製代碼

6、搜索推薦的使用場景

image.png

GET /zoe_article/_search
{
  "query": {
    "match_phrase_prefix": {
      "title": {
        "query": "掘金社區",
        "slop": 10,
        "max_expansions": 10
      }
    }
  }
}
複製代碼

slop移動次數範圍內,前綴匹配(s),max_expansions是用於指定prefix最多匹配多少個term(單詞),超過這個數量就再也不匹配了。

7、總結

ElasticSearch搜索語法太多了,針對不一樣的場景基本上都有對應的語法,能夠參考官網進行進一步的閱讀查詢。

歡迎你們關注微信公衆號(MarkZoe)互相學習、互相交流。

相關文章
相關標籤/搜索