一篇文章讓你學(xué)會Elasticsearch中的查詢

還是慣例算凿,開頭先放章節(jié)目錄份蝴,如果有幫到你的地方,歡迎點贊關(guān)注轉(zhuǎn)發(fā)氓轰,如有錯誤婚夫,歡迎指出,不勝感激

一署鸡、環(huán)境初始化

version: '3.8'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: cerebro
    ports:
     - "9000:9000"
    command:
     - -Dhosts.0.host=http://eshot:9200
    networks:
     - elastic
  kibana:
    image: docker.elastic.co/kibana/kibana:8.1.3
    container_name: kibana
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
      - ELASTICSEARCH_HOSTS=http://eshot:9200
      - server.publicBaseUrl=http://192.168.160.234:5601
    ports:
      - "5601:5601"
    networks:
      - elastic
  eshot:
    image: elasticsearch:8.1.3
    container_name: eshot
    environment:
      - node.name=eshot
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=hot
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
    networks:
      - elastic
  eswarm:
    image: elasticsearch:8.1.3
    container_name: eswarm
    environment:
      - node.name=eswarm
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=warm
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic
  escold:
    image: elasticsearch:8.1.3
    container_name: escold
    environment:
      - node.name=escold
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=eshot,eswarm,escold
      - cluster.initial_master_nodes=eshot,eswarm,escold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - node.attr.node_type=cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data
      - D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs
      - D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
    networks:
      - elastic

# volumes:
#   eshotdata:
#     driver: local
#   eswarmdata:
#     driver: local
#   escolddata:
#     driver: local

networks:
  elastic:
    driver: bridge

二请敦、測試數(shù)據(jù)添加

創(chuàng)建測試索引

PUT /zfc-doc-000001
{
  "settings": {
    "index":{
      "number_of_shards":3,
      "number_of_replicas":2
    }
  },
  "mappings": {
    "properties": {
      "title":{
        "type":"keyword"
      },
      "content":{
        "type":"text"
      },
      "createTime":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
      },
      "agreeNum":{
        "type": "integer"
      },
      "comment":{
        "type": "nested",
        "properties": {
          "content":{
            "type":"text"
          },
          "name":{
            "type":"keyword"
          },
          "time":{
            "type":"date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          }
        }
      }
    }
  }
}

2.1、添加測試數(shù)據(jù)

PUT _bulk
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "1" } }
{ "title" : "Java知識點大全","content":"java 泛型储玫,基本類型有哪些","createTime": "2022-12-19","agreeNum":"99","comment":{"name":"張三","content":"學(xué)習(xí)java必備","time":"2022-12-19 09:00:00"} }
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "2" } }
{ "title" : "MySQL必知必會","content":"mysql 索引、事務(wù)萤皂、鎖","createTime": "2022-12-18","agreeNum":"500","comment":[{"name":"張三","content":"學(xué)習(xí)mysql通俗易懂","time":"2022-12-18 09:00:00"},{"name":"李四","content":"mysql 入門到精通必備的","time":"2022-12-18 10:00:00"}  ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "3" } }
{ "title" : "Redis運維實戰(zhàn)","content":"redis的rdb與aof","createTime": "2022-12-18","agreeNum":"300","comment":[{"name":"小紅","content":"redis的備份","time":"2022-12-18 09:00:00"},{"name":"李四","content": "redis 入門","time":"2022-12-18 15:00:00"}  ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "4" } }
{ "title" : "Elasticsearch","content":"ES crud","createTime": "2022-12-17","agreeNum":"300","comment":[{"name":"小紅","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四","content": "es 入門","time":"2022-12-18 16:00:00"}  ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "5" } }
{ "title" : "常見MQ知識點匯總","content":"rabbitmq kafka rockmq activemq","createTime": "2022-12-16","agreeNum":"260","comment":[{"name":"小紅","content":"kafka的基礎(chǔ)概念","time":"2022-12-18 09:00:00"},{"name":"李四","content": "事務(wù)消息","time":"2022-12-18 15:00:00"}  ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "6" } }
{ "title" : "ES奇淫技巧","content":"玩轉(zhuǎn)es","createTime": "2022-12-18","agreeNum":"600","comment":[{"name":"小紅1號","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四1號","content": "es 入門","time":"2022-12-18 16:00:00"}  ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "7" } }
{ "title" : "ES","content":"真的666","createTime": "2022-12-17","agreeNum":"300","comment":[{"name":"小紅1號","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四1號","content": "es 入門","time":"2022-12-18 16:00:00"}  ]}

三撒穷、標(biāo)準(zhǔn)查詢語句使用

根據(jù)一個字段進(jìn)行檢索,假如我們要搜索content包含ES的文檔裆熙,我們的查詢語句可以這樣寫

GET zfc-doc-000001/_search
{
  "query": {
    "match":{
      "content":"ES"
    }
  }
}

上面這個語句的意思簡單理解就是查詢content字段中包含ES的文檔端礼。在深一層次來看禽笑,首先查看content字段的類型,通過查看上面的創(chuàng)建索引語句可以知道蛤奥,content字段定義的是text類型佳镜,所以Elasticsearch會對content字段進(jìn)行分詞檢索,返回文檔中出現(xiàn)es的凡桥,除了上面這種寫法外還可以使用如下幾種方式進(jìn)行檢索

# 分詞匹配es或者crud的文檔
GET zfc-doc-000001/_search
{
  "query": {
    "match":{
      "content":"ES crud"
    }
  }
}
# 短語查詢分詞es
GET zfc-doc-000001/_search
{
  "query": {
    "match_phrase":{
      "content":"es"
    }
  }
}
# 前綴檢索分詞es
GET zfc-doc-000001/_search
{
  "query": {
    "prefix":{
      "content":"es"
    }
  }
}
# 模糊匹配分詞es
GET zfc-doc-000001/_search
{
  "query": {
    "fuzzy":{
      "content":"es*"
    }
  }
}

為了查詢結(jié)果的更精確蟀伸,增加title字段為ES的約束條件,需要注意大小寫缅刽,因為title字段類型為keyword啊掏,不區(qū)分大小寫的,所以查詢語句可以這樣寫

該語句返回content字段中分詞匹配詞語ES(不區(qū)分大小寫)的文檔或者title字段精確匹配ES的文檔

GET zfc-doc-000001/_search
{
  "query": {
    "multi_match": {
      "query": "ES",
      "fields":["content","title"]
    }
  }
}

一個簡單的檢索語句通過上述幾種方式即可實現(xiàn)了衰猛,但是實際工作中迟蜜,肯定還是用到分詞器的,下面就以常用的IK分詞器進(jìn)行說明

3.1啡省、查詢時指定分詞器

首先是第一種查詢時指定分詞器的形式進(jìn)行檢索

GET /zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": {
        "query": "es",
        "analyzer": "ik_max_word"
      }
    }
  }
}

通過上面指定分詞器的形式娜睛,我們在查詢時就可以使用ik_max_word來作為檢索分詞來處理了,我們也可以在創(chuàng)建索引時增加字段分詞的配置卦睹,方便檢索時默認(rèn)使用指定分詞器檢索畦戒,下面就是創(chuàng)建索引指定分詞器的步驟

3.2、初始化默認(rèn)分詞器

1分预、刪除剛才創(chuàng)建的索引

DELETE zfc-doc-000001

2兢交、修改content字段,加入分詞器ik_max_word笼痹,修改部分如下

      "content":{
        "type":"text",
        "analyzer": "ik_max_word"
      }

完整的語句如下所示

PUT /zfc-doc-000001
{
  "settings": {
    "index":{
      "number_of_shards":3,
      "number_of_replicas":2
    }
  },
  "mappings": {
    "properties": {
      "title":{
        "type":"keyword"
      },
      "content":{
        "type":"text",
        "analyzer": "ik_max_word"
      },
      "createTime":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
      },
      "agreeNum":{
        "type": "integer"
      },
      "comment":{
        "type": "nested",
        "properties": {
          "content":{
            "type":"text"
          },
          "name":{
            "type":"keyword"
          },
          "time":{
            "type":"date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          }
        }
      }
    }
  }
}

通過上面語句創(chuàng)建完索引之后配喳,content字段就是使用ik_max_word分詞的了,這樣使用普通的match查詢即可凳干,這里也就不再演示了

GET zfc-doc-000001/_search
{
  "query": {
    "match":{
      "content":"es"
    }
  }
}

四晴裹、查詢的進(jìn)階使用

4.1、分頁查詢

我們可以使用fromsize參數(shù)配置使用救赐,其中from為要跳過的文檔數(shù)量涧团,size為要返回的文檔數(shù)量

在全部文檔中,過濾前兩個文件经磅,從第3個文檔開始泌绣,返回10個文檔

GET zfc-doc-000001/_search
{
  "query": {
    "match_all": {
    }
  },
  "size": 10,
  "from": 2
}

4.2、范圍查詢

對于范圍查詢预厌,我們可以使用range查詢阿迈,最簡單的參數(shù)就是gtelte

GET zfc-doc-000001/_search
{
  "query": {
    "range": {
      "agreeNum": {
        "gte": 100,
        "lte": 300
      }
    }
  }
}

4.3、聚合

聚合語法的使用就是對一個文檔中某個字段的統(tǒng)計轧叽,類似與關(guān)系型數(shù)據(jù)庫中的先groupcount一個字段的值苗沧,具體使用如下刊棕,如果我們不想返回都是哪些數(shù)據(jù)參與了聚合,還可以加入?yún)?shù)"size":0待逞,如下語句中甥角,其中my_aggs是自定義聚合的名稱,terms是聚合的類型识樱,field是要對哪個字段進(jìn)行聚合嗤无,需要注意的是text類型是無法使用聚合的,terms下面的"size":10是指如果聚合桶的數(shù)量超過10的話只取前10個

GET zfc-doc-000001/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "my_aggs": {
      "terms": {
        "field": "title",
        "size": 10
      }
    }
  }
}

Elasticsearch支持多種聚合類型牺荠,每種類型都有不同的功能和用途翁巍。以下是一些常用的聚合類型及其含義:

  1. Terms Aggregation(詞條聚合):根據(jù)指定字段的值進(jìn)行分組,并計算每個分組的文檔數(shù)量休雌≡詈可以用于統(tǒng)計某個字段的分布情況。

  2. Range Aggregation(范圍聚合):將指定字段的值劃分為不同的范圍杈曲,并計算每個范圍內(nèi)的文檔數(shù)量驰凛。可用于分析數(shù)值型字段的分布情況担扑。

  3. Date Histogram Aggregation(日期直方圖聚合):根據(jù)指定日期字段的值進(jìn)行分組恰响,并按照時間間隔(如按月、按周)計算每個時間段內(nèi)的文檔數(shù)量涌献。

  4. Histogram Aggregation(直方圖聚合):根據(jù)指定字段的值進(jìn)行分組胚宦,并按照指定的間隔計算每個分組的文檔數(shù)量。適用于分析數(shù)值型字段的分布情況燕垃。

  5. Average Aggregation(平均值聚合):計算指定字段的平均值枢劝。

  6. Sum Aggregation(求和聚合):計算指定字段的總和。

  7. Min Aggregation(最小值聚合):計算指定字段的最小值卜壕。

  8. Max Aggregation(最大值聚合):計算指定字段的最大值您旁。

  9. Cardinality Aggregation(基數(shù)聚合):計算指定字段的唯一值的數(shù)量。

  10. Stats Aggregation(統(tǒng)計聚合):計算指定字段的統(tǒng)計信息轴捎,包括最小值鹤盒、最大值、平均值侦副、總和和文檔數(shù)量侦锯。

這只是一小部分聚合類型的示例,Elasticsearch還提供了其他類型的聚合秦驯,如Percentiles Aggregation(百分位數(shù)聚合)率触、Extended Stats Aggregation(擴展統(tǒng)計聚合)等。你可以根據(jù)你的具體需求選擇適合的聚合類型,并結(jié)合查詢條件和其他聚合層級來進(jìn)行復(fù)雜的數(shù)據(jù)分析和統(tǒng)計葱蝗。

如果你看到這了,歡迎點個關(guān)注细燎、后續(xù)推文深度只會越來越深两曼,期待你的關(guān)注,讓我們共同進(jìn)步

elasticsearch還支持嵌套聚合玻驻,只需要在aggs里面在寫一個aggs即可悼凑,可以參考如下寫法,對該示例不符合璧瞬,僅供參考

GET /zfc-doc-000001/_search
{
  "size": 0,
  "aggs": {
    "my_aggs1": {
      "terms": {
        "field": "field1"
      },
      "aggs": {
        "my_aggs2": {
          "terms": {
            "field": "field2"
          },
          "aggs": {
            "avg_value": {
              "avg": {
                "field": "numeric_field"
              }
            }
          }
        }
      }
    }
  }
}

4.4户辫、高亮結(jié)果

如果我們想在返回結(jié)果中對命中的關(guān)鍵詞進(jìn)行高亮顯示可以使用如下語句

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "ES"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    }
  }
}

默認(rèn)是在返回結(jié)果中加入em標(biāo)簽,如果我們想自定義標(biāo)簽可以使用如下語句嗤锉,如下示例是改為了strong標(biāo)簽

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "es"
    }
  },
  "highlight": {
    "pre_tags": ["<strong>"],
    "post_tags": ["</strong>"],
    "fields": {
      "content": {}
    }
  }
}

五渔欢、修改算分提升匹配度

5.1、function_score

假設(shè)我們的原始查詢語句如下

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "es"
    }
  }
}

返回結(jié)果如下瘟忱,ID為6的排在了第一位

如果我們想讓ID為4的排在第一位如何修改查詢語句呢奥额,那么我們可以使用function_score來增加權(quán)重算分,比如使用title中匹配Elasticsearch

此處是為舉例访诱,要學(xué)習(xí)思想垫挨,以后工作中才有更好的思路

修改之后的查詢語句如下

GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "title": "Elasticsearch"
            }
          },
        "weight":2
        }
      ],
      "score_mode": "multiply",
      "boost_mode": "multiply"
    }
  }
}

可以看到,顯示結(jié)果已經(jīng)發(fā)生改變触菜,ID為4的算分已經(jīng)高于ID為6的算分了

其中九榔,query參數(shù)用于指定正常的查詢語句,functions參數(shù)用于定義一個或多個函數(shù)來修改文檔得分

score_modeboost_mode是用于控制function_score查詢中如何計算文檔得分和如何影響文檔的排名的參數(shù)涡相。

  • score_mode:參數(shù)用于指定多個函數(shù)如何組合計算得分哲泊。它支持以下取值:

    • multiply: 將所有函數(shù)的得分相乘
    • sum: 將所有函數(shù)的得分相加
    • avg: 將所有函數(shù)的得分求平均值
    • max: 取所有函數(shù)的最大得分作為文檔得分
    • min: 取所有函數(shù)的最小得分作為文檔得分
    • first: 取第一個函數(shù)的得分作為文檔得分
    • weighted_sum: 將所有函數(shù)的得分相加,并乘以給定的權(quán)重系數(shù)漾峡。
  • boost_mode參數(shù)用于指定得分如何影響文檔的排名攻旦。它支持以下取值:

    • multiply: 將得分與文檔的原始得分相乘
    • replace: 使用得分替換文檔的原始得分
    • sum: 將得分與文檔的原始得分相加
    • avg: 將得分與文檔的原始得分求平均值
    • max: 取得分和文檔的原始得分的最大值作為文檔得分
    • min: 取得分和文檔的原始得分的最小值作為文檔得分

請注意,score_modeboost_mode參數(shù)的取值會影響文檔得分和排名的計算方式生逸,需要根據(jù)具體的需求來選擇合適的取值牢屋。另外,function_score查詢中可以定義多個函數(shù)來修改文檔得分槽袄,也可以使用weight函數(shù)來給定固定的分值烙无,這些函數(shù)的組合和參數(shù)設(shè)置可能會對結(jié)果產(chǎn)生重要影響。

除了使用上述方式外遍尺,還可以使用如下幾種方式進(jìn)行算分的修改

5.2截酷、Boosting

如下是匹配content字段中包含es的,對content中包含es的進(jìn)行減分

GET zfc-doc-000001/_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "content": "es"
        }
      },
      "negative": {
        "term": {
          "content": "玩轉(zhuǎn)"
        }
      },
      "negative_boost": 0.5
    }
  }
}

5.3乾戏、Field Value Factor

需要注意的是迂苛,field_value_factor函數(shù)用于根據(jù)字段的數(shù)值進(jìn)行打分計算三热,要求字段是數(shù)值類型的。

我們使用Field Value Factor來根據(jù)字段agreeNum的值對包含ES關(guān)鍵詞的文檔進(jìn)行加權(quán)三幻。使用log1p修飾符可以將字段值的對數(shù)應(yīng)用于計算

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "ES"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}
GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "ES"
        }
      },
      "field_value_factor": {
        "field": "agreeNum",
        "factor": 0.1,
        "modifier": "log1p"
      }
    }
  },
  "sort": [
    {
      "_score": {
        "order": "asc"
      }
    }
  ]
}

其中field_value_factor的參數(shù)含義如下

  • field: 要計算得分的字段名
  • factor: 一個乘數(shù)就漾,用于縮放字段值的影響∧畎幔可以使用任何非負(fù)數(shù)值抑堡。假如factor的值是0.1,表示字段值的影響將會被減小
  • modifier: 一個修飾符朗徊,用于對數(shù)值進(jìn)行修改以調(diào)整得分
    • none:不應(yīng)用任何修飾符首妖,默認(rèn)情況下為1
    • log:對計算結(jié)果取對數(shù),以減少較大值的影響
    • log1p:與log類似爷恳,但在計算結(jié)果前先加1有缆,可以避免對0值進(jìn)行對數(shù)運算

5.4、Script Score

我們可以使用script_score來自定義計算得分舌仍,此處僅為示例妒貌,具體可以根據(jù)自己的業(yè)務(wù)來修改。具體計算分可以通過explain來查看驗證

GET zfc-doc-000001/_search
{
  "explain": true, 
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "script_score": {
        "script": {
          "source": "Math.log(doc['agreeNum'].value + 10)"
        }
      }
    }
  }
}

5.5铸豁、Decay Functions

我們使用Gauss衰減函數(shù)根據(jù)字段createTime的值來衰減文檔的得分灌曙。在這個例子中,以2022-12-01為中心节芥,每過10天在刺,得分將衰減一半。參考結(jié)果可以使用下面兩個查詢語句對應(yīng)

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "es"
    }
  }
}

GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "functions": [
        {
          "gauss": {
            "createTime": {
              "origin": "2022-12-01",
              "scale": "10d"
            }
          }
        }
      ]
    }
  }
}

六头镊、Filter

FilterQueryElasticsearch中用于檢索和過濾數(shù)據(jù)的兩種不同方式蚣驼,它們各自有一些優(yōu)缺點

Filter的優(yōu)點:

  1. 性能更高:Filter對結(jié)果進(jìn)行緩存,可以重復(fù)使用緩存結(jié)果相艇,提高查詢的性能颖杏。當(dāng)使用相同的過濾條件進(jìn)行多次查詢時,F(xiàn)ilter可以避免重復(fù)計算
  2. 精確性更高:Filter對結(jié)果進(jìn)行精確匹配坛芽,只返回滿足過濾條件的文檔留储,不計算相關(guān)性得分。這使得Filter非常適用于那些不需要考慮相關(guān)性的精確匹配查詢
  3. 可緩存性:Filter的結(jié)果可以被緩存咙轩,可以在后續(xù)的查詢中重復(fù)使用获讳。如果數(shù)據(jù)沒有變化,那么緩存的結(jié)果可以直接返回活喊,減少了計算的開銷

Filter的缺點:

  1. 無法計算相關(guān)性得分:Filter不計算相關(guān)性得分丐膝,因此無法進(jìn)行排序或評分。如果需要根據(jù)文檔的相關(guān)性進(jìn)行排序或評分,就需要使用Query
  2. 不支持全文搜索:Filter只能進(jìn)行精確匹配帅矗,無法進(jìn)行全文搜索偎肃。如果需要進(jìn)行全文搜索,就需要使用Query

Query的優(yōu)點:

  1. 支持全文搜索:Query可以進(jìn)行全文搜索损晤,可以對文本進(jìn)行分詞和相關(guān)性評分软棺,返回與查詢條件最匹配的文檔
  2. 支持排序和評分:Query可以根據(jù)文檔的相關(guān)性得分進(jìn)行排序和評分,使得搜索結(jié)果更具有相關(guān)性
  3. 靈活性更高:Query提供了更多的查詢選項和查詢語法尤勋,可以進(jìn)行復(fù)雜的查詢操作,包括布爾邏輯茵宪、范圍查詢最冰、模糊查詢等

Query的缺點:

  1. 性能相對較低:Query需要計算相關(guān)性得分,并對所有文檔進(jìn)行評分和排序稀火,因此相對于Filter而言暖哨,性能較低
  2. 無法緩存結(jié)果:由于Query計算的是相關(guān)性得分,結(jié)果會隨著數(shù)據(jù)的變化而變化凰狞,無法進(jìn)行緩存和重復(fù)使用

綜上所述篇裁,F(xiàn)ilter適用于需要精確匹配和高性能的查詢場景,而Query適用于需要全文搜索赡若、排序和評分的場景达布。根據(jù)具體的需求和性能要求,選擇合適的過濾方式可以提高查詢的效率和準(zhǔn)確性

補充

Elasticsearch的查詢DSL語句中有很多常用的參數(shù)逾冬,用于指定查詢的條件和行為黍聂。以下是一些常用的查詢:

  1. match: 使用match查詢參數(shù)可以執(zhí)行全文本搜索,它會將查詢字符串分析為詞項并與文檔進(jìn)行匹配
  2. term: term查詢參數(shù)用于精確匹配某個字段的值身腻,不進(jìn)行分析
  3. bool: bool查詢參數(shù)用于組合多個查詢條件产还,如must(與操作)、should(或操作)嘀趟、must_not(非操作)
  4. range: range查詢參數(shù)用于匹配指定范圍內(nèi)的值脐区,可以用于數(shù)值、日期等類型的字段
  5. exists: exists查詢參數(shù)用于匹配包含指定字段的文檔
  6. prefix: prefix查詢參數(shù)用于匹配以指定前綴開頭的字段值
  7. wildcard:wildcard查詢參數(shù)用于支持通配符匹配她按,如使用*?進(jìn)行模糊匹配
  8. fuzzy: fuzzy查詢參數(shù)用于執(zhí)行模糊匹配牛隅,可以處理拼寫錯誤或相似度較高的查詢字符串
  9. match_phrase: match_phrase查詢參數(shù)用于匹配包含指定短語的文檔
  10. multi_match: multi_match查詢參數(shù)用于在多個字段中執(zhí)行全文本搜索
  11. terms:terms查詢是一種多詞項查詢,用于查找包含給定詞項中任何一個的文檔
  12. match_phrase_prefix:match_phrase_prefix查找包含指定短語前綴的文檔尤溜。它可以通過指定一個短語前綴和一個最大擴展長度來實現(xiàn)
  13. regexp:regexp是使用正則表達(dá)式匹配文檔的倔叼,能夠在文本字段中匹配符合正則表達(dá)式的文本,從而檢索文檔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宫莱,一起剝皮案震驚了整個濱河市丈攒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖巡验,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件际插,死亡現(xiàn)場離奇詭異,居然都是意外死亡显设,警方通過查閱死者的電腦和手機框弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捕捂,“玉大人瑟枫,你說我怎么就攤上這事≈冈埽” “怎么了慷妙?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長允悦。 經(jīng)常有香客問我膝擂,道長,這世上最難降的妖魔是什么隙弛? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任架馋,我火速辦了婚禮,結(jié)果婚禮上全闷,老公的妹妹穿的比我還像新娘叉寂。我一直安慰自己,他們只是感情好室埋,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布办绝。 她就那樣靜靜地躺著,像睡著了一般姚淆。 火紅的嫁衣襯著肌膚如雪孕蝉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天腌逢,我揣著相機與錄音降淮,去河邊找鬼。 笑死搏讶,一個胖子當(dāng)著我的面吹牛佳鳖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播媒惕,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼系吩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妒蔚?” 一聲冷哼從身側(cè)響起穿挨,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤月弛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后科盛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帽衙,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年贞绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了厉萝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨崩,死狀恐怖谴垫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布帽哑,位于F島的核電站羽嫡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舞肆。R本人自食惡果不足惜焦辅,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椿胯。 院中可真熱鬧筷登,春花似錦、人聲如沸哩盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廉油。三九已至惠险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抒线,已是汗流浹背班巩。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘶炭,地道東北人抱慌。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像眨猎,于是被迫代替她去往敵國和親抑进。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容