Elasticsearch | 對文本實現模糊、精確、分詞搜索

這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰算法

Elasticsearch 是一個分佈式、高擴展、高實時的搜索與數據分析引擎,它具備強大的搜索功能。sql

對文本搜索通常能夠分爲三種類型:模糊搜索、精確搜索、分詞搜索。markdown

  • 模糊搜索:如sql中的like查詢語句,匹配包含搜索關鍵字的內容。數據結構

  • 精確搜索:文本內容與搜索關鍵字一致。app

  • 分詞搜索:將文本先進行分詞,包括搜索關鍵字分詞和搜索內容進行分詞,再匹配相關內容。數據結構和算法

用一個例子說明:分佈式

咱們有一串文本「我正在學習數據結構和算法」,ide

若是是模糊搜索,用「學習」、「數據結構」、「算法」等關鍵詞就能搜索出結果post

若是是精確搜索,搜索關鍵詞必定爲「我正在學習數據結構和算法」才能搜出結果學習

若是是分詞搜索,「算法之美」關鍵詞就能搜索出結果,由於分詞搜索,只須要將關鍵字的分詞匹配上就能夠了。而使用模糊搜索,是不能正確搜索出結果的。

在Elasticsearch中,使用「term」,「match」,「match_phrase」,「keyword」進行相關搜索。接下來咱們用實驗演示不一樣的搜索效果。

相關準備:

索引base-product-spu-info中有一條數據:

{
"spuName" : "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
}
複製代碼

對「【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付」分詞(默認分詞器,單個字分詞)

GET base-product-spu-info/_analyze
{
"analyzer": "standard",
  "text":  "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
}
// 分詞結果:市|場|價|2532|huawei|watch|2|pro|4g|智|能|手|表|移|動|支|付
複製代碼

term 搜索

term搜索是對搜索詞不進行分詞搜索,但對搜索的字段仍是會分詞,而加keyword屬性,則是不分詞的精準搜索

  1. 關鍵字「智」搜索
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "智"
      }
    }
  }
}
// 結果:搜索出數據
複製代碼
  1. 關鍵字「智能」搜索
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "智能"
      }
    }
  }
}
// 結果:不能搜索出數據
複製代碼
  1. 關鍵字「Pro」搜索
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "Pro"
      }
    }
  }
}
// 結果:不能搜索出數據
複製代碼
  1. 關鍵字「pro」搜索(小寫)
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "pro"
      }
    }
  }
}
// 結果:搜索出數據
複製代碼
  1. 關鍵字「【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付」搜索
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
      }
    }
  }
}
// 結果:不能搜索出數據
複製代碼
  1. 關鍵字「【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付」搜索(增長keyword關鍵字
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName.keyword": {
        "value": "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
      }
    }
  }
}
// 結果:搜索出數據
複製代碼

match搜索 (分詞搜索)

先對搜索詞進行分詞,再進行分詞搜索

GET base-product-spu-info/_search
{
  "query": {
    "match": {
      "spuName": "手機"
    }
  }
}
// 結果:搜索出數據
複製代碼

match_phrase 搜索(模糊搜索)

短語搜索, 要求全部的分詞必須同時出如今文檔中,同時位置必須緊鄰一致**

GET base-product-spu-info/_search
{
  "query": {
    "match_phrase": {
      "spuName": "智能手錶"
    }
  }
}
// 結果:搜索出數據

GET base-product-spu-info/_search
{
  "query": {
    "match_phrase": {
      "spuName": "智能手錶1"
    }
  }
}
// 結果:不能搜索出數據
複製代碼
相關文章
相關標籤/搜索