嘿~ 今天天气不错嘛

請問一下match 跟 term的差異

Elasticsearch | 作者 dadaball | 发布于2021年06月02日 | 阅读数:1069

請問各位大佬,我新增一筆資料不設定mapping 讓他會產生 name 跟 name.keyword 的字段
POST test/_doc
{
  "name" : "ANDY"
}
 
但是用下方的 match 語法對 name.keyword 查詢大寫ANDY 會查的到資料?
就我的認知來說,使用match 會把輸入的值(ANDY)分詞後轉小寫(andy)(預設standard 的分詞器)
再去name.keyword 去比對資料,但name.keyword 存的資料應該都是大寫的ANDY 
我不知道是我哪邊搞糊,還請各位大佬解個惑 ,先謝謝了
GET test/_search
{
  "query": {
    "match": {
      "name.keyword": "ANDY"
    }
  }
}
已邀请:

Charele - Cisco4321

赞同来自: dadaball

你说的“會把輸入的值(ANDY)分詞後轉小寫(andy)(預設standard 的分詞器)”,
这些只是针对text这种分词的类型来说的,
name.keyword是keyword类型的,不会这么做的,只是简单的匹配。
 
 
至于termQuery还是matchQuery的问题,
其实这个"TermQuery"是lucene里面的类型,
因为Lucene里面并没有"MatchQuery"这个一样类型,所以Lucene并不认识"match query",
 
所谓的"match query"只是ES提供给用户的一个API,
所以要分解成TermQuery类型(或者是bool + TermQuery)传给Lucene,
因为实际工作都是由Lucene来完成的
 

Ombres

赞同来自:

match在keyword字段会改写成term,可以使用profile参数看看执行计划

dadaball

赞同来自:

不好意思 ,我搭配
這四種組合都是 TermQuery
1. match + keyword 字段
2. match + 無keyword 字段 
3. term + keyword 字段
4. term + 無keyword 字段
我想說用match 應該是 matchQuery
term 應該是 termQuery
結果都是 termQuery
還是不懂 Orz  

要回复问题请先登录注册