因為 elasticsearch 要打很多字,寫文苦手如我決定縮寫它,所以會用 ES 代稱。
前一篇提到 ES 大致可以區分四種 query,這一篇來說明其中的 term-level query。
term-level query 需要搜尋詞與索引的內容完全一致才算符合,主要的使用情境是拿來搜尋關鍵字,例如商品的分類、品牌、id 、價格或名稱等資訊。
雖然說是『內容完全一致』但其實也提供了 fuzzy search、wildcard search、regex 等功能,可以想像是一般 RDB 的 where 子句中篩選條件的感覺。
以下是一個簡單的 term query 範例
# create index
PUT term_level_search_001
{
"mappings": {
"properties": {
"user":{
"type": "keyword"
}
}
}
}
# insert document
PUT term_level_search_001/_doc/1
{
"user": "Kim Cheng"
}
# search with term query
## 這個 query 不會 match 因為 term query 需要完全 match
GET term_level_search_001/_search
{
"query": {
"term": {
"user": "Kim"
}
}
}
## 這個 query 會 match
GET term_level_search_001/_search
{
"query": {
"term": {
"user": "Kim Cheng"
}
}
}
GET term_level_search_001/_search
{
"query": {
"fuzzy": {
"user": {
"value": "Kim Che",
"fuzziness": "AUTO",
"prefix_length": 3
}
}
}
}
除了文字搜尋之外,也可以搜尋數字或日期。
# create index
PUT term_level_search_002
{
"mappings": {
"properties": {
"session_count":{
"type": "integer"
},
"visit_date": {
"type": "date"
}
}
}
}
# insert documents
PUT term_level_search_002/_doc/1
{
"session_count": 10, "date": "2024-03-01"
}
PUT term_level_search_002/_doc/2
{
"session_count": 5, "date": "2024-05-16"
}
PUT term_level_search_002/_doc/2
{
"session_count": 1, "date": "2023-07-01"
}
# search with term query
GET term_level_search_002/_search
{
"query": {
"term": {
"session_count": 1
}
}
}
除了單一值的搜尋,也可以使用 ragne
query 搜尋區間:
GET term_level_search_002/_search
{
"query": {
"**range**": {
"date": {
"gte": "now-60d/d",
"lte": "now/d"
}
}
}
}
如果你有使用過 Mongo,應該會覺得非常的熟悉,這些語法使用上大同小異,ES 的官方文件也寫得非常清楚,所以就不再多講了。
下一篇會繼續說明 search query 相關的內容。