- term查询是基于词项的查询,而且当设置为term查询时,es不会对这个词做任何处理,但是在文本进行分词时,通常都会将大写转为小写,这个时候就会出现查不出来的情况,比如:
POST /test_2017/_doc
{
"name":"Pantheon"
}
这样创建出来的doc可以看到明显做了lowercase,因为用的standard分词器
GET /test_2017/_analyze
{
"field": "name",
"text": "Pantheon"
}
所以当使用下面的语句去查时,会没有结果
GET /test_2017/_search
{
"query": {
"term": {
"name": {
"value": "Pantheon"
}
}
}
}
所以需要使用es给字段额外添加的一个元数据信息.keyword,在生成文本时,es也会将该字段原封不动的保存到keyword属性当中去,所以下面这个语句可以查询出来
GET /test_2017/_search
{
"query": {
"term": {
"name.keyword": {
"value": "Pantheon"
}
}
}
}
- match 和match_pharse查询都是属于全文查询,全文查询会给当前的句子进行分词,通常来讲,索引的时候咋分的词,查询的时候就是用的什么分词器,默认是不用设置的,但是如果有个别场景,也可以自己设置分词器,ok,他两的区别举个例子,"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
}
}
}
}




3.总结
这三种查询都是对分词组合不同的玩法,term查询,只是查分词,不会对查询语句做任何处理,match查询,查询语句分词后对文档是否包含的一种,match_phase是对查询语句分词后,各词项间隔距离多少的玩法
网友评论