這是我參與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搜索是對搜索詞不進行分詞搜索,但對搜索的字段仍是會分詞,而加keyword屬性,則是不分詞的精準搜索
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName": {
"value": "智"
}
}
}
}
// 結果:搜索出數據
複製代碼
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName": {
"value": "智能"
}
}
}
}
// 結果:不能搜索出數據
複製代碼
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName": {
"value": "Pro"
}
}
}
}
// 結果:不能搜索出數據
複製代碼
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName": {
"value": "pro"
}
}
}
}
// 結果:搜索出數據
複製代碼
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName": {
"value": "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
}
}
}
}
// 結果:不能搜索出數據
複製代碼
GET base-product-spu-info/_search
{
"query": {
"term": {
"spuName.keyword": {
"value": "【市場價2532】HUAWEI WATCH 2 Pro 4G智能手錶 移動支付"
}
}
}
}
// 結果:搜索出數據
複製代碼
先對搜索詞進行分詞,再進行分詞搜索
GET base-product-spu-info/_search
{
"query": {
"match": {
"spuName": "手機"
}
}
}
// 結果:搜索出數據
複製代碼
短語搜索, 要求全部的分詞必須同時出如今文檔中,同時位置必須緊鄰一致**
GET base-product-spu-info/_search
{
"query": {
"match_phrase": {
"spuName": "智能手錶"
}
}
}
// 結果:搜索出數據
GET base-product-spu-info/_search
{
"query": {
"match_phrase": {
"spuName": "智能手錶1"
}
}
}
// 結果:不能搜索出數據
複製代碼