日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Elasticsearch文檔查詢詳解

作者:Y4Snail 更新時間: 2022-08-15 編程語言

文章目錄

  • match查詢
    • 單條件匹配查詢
    • 單字段多條件匹配查詢
  • term查詢
  • 查詢附加操作
    • 篩選字段
    • 排序
    • limit操作
    • 多條件查詢
      • AND查詢
      • OR查詢
    • 不等于查詢
    • 范圍查詢
    • 高亮查詢

match查詢

單條件匹配查詢

GET /索引名/類型名/_search
{
  "query": {
    "match": {
      "文檔字段名": "文檔字段值"
    }
  }
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }
}

如果文檔中被匹配的字段包含中文則會進行模糊搜索,如果只有英文則會精確搜索,舉例說明:

字段名 文檔1 文檔2 文檔3
name java java123 java張三

如果name匹配java的話可以匹配到java、java張三但是匹配不到java123。

單字段多條件匹配查詢

GET yzq/user/_search
{
  "query": {
    "match": {
      "文檔字段名": "字段值1 字段值2"(多個字段值以空格分開)
    }
  }
}

查詢索引中tags中包含男、技術關鍵詞的文檔,會檢索出包含男關鍵詞、技術關鍵詞、以及兩個都包含的文檔,包含越多的查詢排名越靠前。

GET yzq/user/_search
{
  "query": {
    "match": {
      "tags": "男 技術"
    }
  }
}

通常tags的值像是這樣:“tags”: [“技術宅”,“溫暖”,“直男”]

term查詢

GET /索引名/類型名/_search
{
  "query": {
    "term": {
      "文檔字段名": "文檔字段值"
    }
  }
}
GET yzq/user/_search
{
  "query": {
    "term": {
      "name": "爪哇 java"
    }
  }
}

term和match關鍵字的區別在于是否將查詢的字段值做拆分,以上面的GET查詢為例。

  • 如果使用term則name字段不會被分詞器拆分,因此本次查詢會根據“爪哇 java”這個詞到倒排索引中進行匹配;
  • 如果使用match則name字段會被分詞器拆分為“爪哇”和“java”再拿這兩個單次到倒排索引中進行匹配(或的關系,只要有一個匹配成就算成功)

text和keyword是指在建立索引時聲明的某個字段的類型。

  • 如果是text則新插入文檔時就會對該字段進行分詞處理后,把分好的詞寫入倒排索引中,以上面的GET為例會把“爪哇”和“java”這兩個詞寫入倒排索引
  • 如果是keyword則新插入文檔時不會對該字段進行分析處理,直接把單次完整的寫入倒排索引中,以上面的GET為例則只會把“爪哇 java”這個完整的詞寫入倒排索引

通常情況下是如下搭配:

  • match + text (如果是term + text,使用term查詢時,查詢條件不會進行分詞。但是text類型的數據,在倒排索引中實際存儲的是分詞的數據。term條件區分大小寫,而text數據經過默認的standard analyzer分詞器分詞,大寫字母全部轉為了小寫字母,并存入了倒排索引以供搜索,所以這里需要注意大小寫匹配的問題)
  • term + keyword(如果是match + keyword則等效term)

查詢附加操作

篩選字段

如果不想要文檔中的所有字段值的話可以通過_source字段來篩選出想要的值。附上格式和例子:

GET /索引名/類型名/_search
{
  "query": {
    "match": {
      "文檔字段名": "文檔字段值"
    }
  }
  "_source": ["字段1", "字段2", ...]
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "_source": ["name", "desc"]
}

排序

GET /索引名/類型名/_search
{
  "query": {
    "match": {
      "文檔字段名": "文檔字段值"
    }
  }
  "sort": [
  	{
		"文檔字段名": {
			"order": "asc"/"desc"(二選一)
		}
	}
  ]
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

limit操作

GET /索引名/類型名/_search
{
  "query": {
    "match": {
      "文檔字段名": "文檔字段值"
    }
  }
  "sort": [
  	{
		"文檔字段名": {
			"order": "asc"/"desc"(二選一)
		}
	}
  ]
  "from": 從哪開始(默認第一條文檔下標為0),
  "size": 截取多少條
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

多條件查詢

這種查詢支持多個條件同時查詢,這些條件的關系可以是AND(must)和OR(should)

AND查詢

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "文檔字段名1": "文檔字段值1"
          }
        },
        {
          "match": {
            "文檔字段名2": 文檔字段值2
          }
        }
      ]
    }
  }
}

查詢索引中name匹配java而且age為23的文檔

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        },
        {
          "match": {
            "age": 23
          }
        }
      ]
    }
  }
}

OR查詢

GET yzq/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "文檔字段名1": "文檔字段值1"
          }
        },
        {
          "match": {
            "文檔字段名2": 文檔字段值2
          }
        }
      ]
    }
  }
}

查詢索引中name匹配java或者age為23的文檔

GET yzq/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "java"
          }
        },
        {
          "match": {
            "age": 23
          }
        }
      ]
    }
  }
}

不等于查詢

關鍵字must_not

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "文檔字段名": 文檔字段值
          }
        }
      ]
    }
  }
}

查詢索引中age不等于3的文檔

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 3
          }
        }
      ]
    }
  }
}

范圍查詢

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        }
      ],
      "filter": {
        "range": {
          "文檔字段名": {
            "gte": 值大于等于多少,也可以是大于多少(gt),
            "lte": 值小于等于多少,也可以是小于多少(lt)
          }
        }
      }
    }
  }
}

查詢索引中name匹配java的文檔中并且age值小于10的所有文檔

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "lt": 10
          }
        }
      }
    }
  }

查詢索引中age大于等于10且小于等于30的所有文檔

GET yzq/user/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 30
      }
    }
  }
}

高亮查詢

  • 默認高亮顯示的標簽是em,也可以日通過pre_tags和post_tags改成自己想要的標簽,遵循html頁面的寫法。
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  },
  "highlight": {
    "pre_tags": "想要定義的前綴", 
    "pre_tags": "想要定義的后綴",
    "fields": {
      "需要匹配的字段名":{} 
    }
  }
}

查詢索引中name匹配java的所有文檔,并高亮顯示查詢的name字段。

GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>", 
    "post_tags": "</p>",
    "fields": {
      "需要匹配的字段名":{} 
    }
  }
}

原文鏈接:https://blog.csdn.net/koutaoran4812/article/details/126167985

相關推薦

欄目分類
最近更新