一、text欄位和keyword欄位的區別
在瞭解這些查詢之前的區別之前,先了解一下text欄位和keyword欄位的區別:
- 建立索引和型別,引入keyword欄位
PUT my_index
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
}
}
}
}
GET /my_index
可以看到已經建立好了,欄位的型別是keyword
預設的索引型別就是_doc
新增一條資料
POST /my_index/_doc/1
{
"name":"first test"
}
然後查詢
GET /my_index/_search
{
"query": {
"term": {
"name":"first"
}
}
}
GET /my_index/_search
{
"query": {
"term": {
"name":"test"
}
}
}
可以看到沒有查到任何資料
然後查詢
GET /my_index/_search
{
"query": {
"term": {
"name": "first test"
}
}
}
可以看到匹配到了資料
所以將欄位設定為keyword,查詢的時候已有的值不會被分詞
- 現在新增一個text型別的欄位
PUT /my_index/_mapping
{
"properties":{
"tag":{
"type":"text"
}
}
}
GET /my_index
往之前已經建立的doc之中新增tag的資料:
POST /my_index/_doc/1
{
"name":"first test",
"tag":"second test"
}
或者使用
(推薦)
POST /my_index/_doc/1/_update
{
"doc":{
"tag":"second test"
}
}
可以看到資料已經進去了
然後對tag欄位進行查詢:
POST /my_index/_search
{
"query": {
"term": {
"tag": "second"
}
}
}
POST /my_index/_search
{
"query": {
"term": {
"tag": "test"
}
}
}
現在輸入全部的查詢:
POST /my_index/_search
{
"query": {
"term": {
"tag": "second test"
}
}
}
說明text型別的欄位會被分詞,查詢的時候如果使用拆開查可以查到,但是要直接使用全部查詢,就查不到。
注意:”1, 2”會被拆分為[1,2],但是”1,2”是不會被拆分的,因為之間少了個空格。
二、match和term的區別
1、term
1)、term查詢keyword欄位
term不會分詞,而keyword欄位也不分詞。需要完全匹配才可以
但是如果分詞查詢,會無法匹配到對應的資料
2)、term查詢keyword欄位
因為text欄位會分詞,而term不會分詞,所以term查詢條件必須是text欄位分詞後的某一個
如果是輸入全部查詢:
或者部分輸入
查詢失敗,因為現在的tag已經被分詞了,儲存是[listen,to,music]
2、match查詢text欄位
match分詞,text也分詞,只要match的分詞結果和text的分詞結果有相同就匹配
成功。如果都不相同就失敗了。
3、match_phrase
1)、match_phrase匹配keyword欄位
match_phrase會被分詞,而keyword不會被分詞,match_phrase的需要和keyword完全匹配才可以
只有這種情況才是成功的
2)match_phrase匹配text欄位
match_phrase是分詞的,text也是分詞的。match_phrase的分詞結果必須再text欄位分詞中都包含,而且順序必須相同,而且必須都是連續的
如果不是連續的,就會失敗
4、query_string
1)query_string查詢key型別的欄位,必須是全部匹配
2)query_string查詢text型別的欄位
和match_phrase區別的是,query_string查詢text型別欄位,不需要連續,順序還可以調換
本作品採用《CC 協議》,轉載必須註明作者和本文連結