- term查詢是基于詞項的查詢,而且當設置為term查詢時,es不會對這個詞做任何處理,但是在文本進行分詞時,通常都會將大寫轉為小寫,這個時候就會出現(xiàn)查不出來的情況,比如:
POST /test_2017/_doc
{
"name":"Pantheon"
}
這樣創(chuàng)建出來的doc可以看到明顯做了lowercase,因為用的standard分詞器
GET /test_2017/_analyze
{
"field": "name",
"text": "Pantheon"
}
所以當使用下面的語句去查時,會沒有結果
GET /test_2017/_search
{
"query": {
"term": {
"name": {
"value": "Pantheon"
}
}
}
}
所以需要使用es給字段額外添加的一個元數(shù)據(jù)信息.keyword,在生成文本時,es也會將該字段原封不動的保存到keyword屬性當中去,所以下面這個語句可以查詢出來
GET /test_2017/_search
{
"query": {
"term": {
"name.keyword": {
"value": "Pantheon"
}
}
}
}
- match 和match_pharse查詢都是屬于全文查詢,全文查詢會給當前的句子進行分詞,通常來講,索引的時候咋分的詞,查詢的時候就是用的什么分詞器,默認是不用設置的,但是如果有個別場景,也可以自己設置分詞器,ok,他兩的區(qū)別舉個例子,"I am Pantheon",這句話如果用match來查,會搜出字段中有"I","am","Pantheon"的文檔,也就是說默認是只要這段話中有這查詢幾個詞的一個就返回文檔,當然也可以設置他的'operator'屬性為'and',要求查出來的必須包含"I am Pantheon"這幾個詞",而match_pharse可以精確的查詢"I am Pantheon"這一段話,這幾個詞之間有沒有間隔可以通過slot屬性來設置,比如設置了slot為1,那就可以查出"I am not Pantheon"這樣的句子,舉例如下:
POST /test_2017/_bulk
{ "index": { "_id": 1 }}
{ "desc":"I am Pantheon" }
{ "index": { "_id": 2 }}
{ "desc":"I am not Pantheon" }
{ "index": { "_id": 3 }}
{ "desc":"I am Leo" }
### 結果1
GET /test_2017/_search
{
"query": {
"match": {
"desc": "I am Pantheon"
}
}
}
### 結果2
GET /test_2017/_search
{
"query": {
"match": {
"desc":{
"query": "I am Pantheon",
"operator": "and"
}
}
}
}
### 結果3
GET /test_2017/_search
{
"query": {
"match_phrase": {
"desc":{
"query": "I am Pantheon"
}
}
}
}
### 結果4
GET /test_2017/_search
{
"query": {
"match_phrase": {
"desc":{
"query": "I am Pantheon",
"slop": 1
}
}
}
}

結果1

結果2

結果3

結果4
3.總結
這三種查詢都是對分詞組合不同的玩法,term查詢,只是查分詞,不會對查詢語句做任何處理,match查詢,查詢語句分詞后對文檔是否包含的一種,match_phase是對查詢語句分詞后,各詞項間隔距離多少的玩法