Elastic Search term, match, match_phrase 和 match_phrase_prefix 查询时的区别

字段类型分 keyword (不分词) 和 text (分词)
字段值为 "quick brown fox", 详细的create index 和 insert data 语句在后边

注意:keyword类型字段不分词,text类型字段
keyword类型的字段值就是 "quick brown fox",不分词,必须当成一个整体
text类型的字段值是 "quick brown fox",分词,可以当成一个有序list ["quick", "brown", "fox"]

按照字段值类型来分:
一、keyword类型字段值不分词,term, match, match_phrase查询语句必须与字段值完全匹配
例如查询语句必须是 ["quick brown fox"] 才能查出来,["quick", "brown", "fox"]中的任何一个值都不行。
二、text字段值分词
1. term查询语句不分词,因此查询语句必须是text字段分词之后的某一个才行。
例如查询语句必须是 ["quick", "brown", "fox"] 中的某一个才行。而["quick brown", "quick brown fox", "quick " ] 中的任务一个不行,包括 "quick brown fox" 和 "quick "(因为有个空格,term不对对查询语句分词,其值包含空格,而数据分词后不带空格,导致不匹配)
2. match查询语句分词, 因此查询语句分词后和字段值分词后的结果的交集不为空,就可以查询出来。
例如查询语句 ["quick", "brown", "fox", "quick ", "quick brown fox", "a brown b", "fox quick"] 中的任何一个都行。
3. match_phrase查询语句分词,加上顺序原因,因此查询语句必须是index字段值的一部分才行。类似于python中的list,必须是其中的一个连续切片就行。也可以理解为字符串的字串,但是单词不能截断。
例如查询语句 ["quick", "brown", "fox", "quick ", "quick brown fox", " brown fox"] 中的任何一个都行。
但是, ["fox quick", "quick brown f", "quick fox"]不行。fox quick是因为顺序不同,也就是不是其中的字串; "quick fox"不行因为中间漏了一个单词,也就是不是字段值的子串;"quick brown f"不行是因为单词被截断了。
4. match_phrase_prefix 查询语句分词,和match_phrase类似,和 match_phrase_prefix 的区别是可以理解为字符串的子串,但是单词可以截断。
例如查询语句 ["quick", "brown", "fox", "quick ", "quick brown fox", " brown fox", "quick brown fo", "quick brown fo*"] 都能查出来,
对于中文来说,因为每个中文字均不能分割,所以和match_phrase_prefix没有任何区别
对于英文来说,单词可以分割为字母,和match_phrase_prefix有区别
例如:match_phrase查询值为"quick brown fo"查不出来,而match_phrase_prefix查询值为"quick brown fo"则能查出来

delete /query_example
PUT /query_example
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "keyword_value": {
        "type": "keyword"
      },
      "text_value": {
        "type": "text"
      }
      }
    }
  }
}
POST /query_example/_doc/
{ 
  "id":	1,
  "keyword_value": "quick brown fox",
  "text_value": "quick brown fox"
}

GET query_example/_search	
{
  "query": {
    "term": {
      "keyword_value": "quick"   /* 返回0行 */
    }
  }
}
GET query_example/_search	
{
  "query": {
    "match_phrase_prefix": {
      "keyword_value": "quick"   /* failed to create query: Can only use phrase prefix queries on text fields - not on [keyword_value] which is of type [keyword] */
    }
  }
}

 

posted @ 2024-04-11 15:19  panda4671  阅读(145)  评论(0编辑  收藏  举报