Es 精确查找的方式

 

要求:

 Es查询:

 

查询工单信息, 输入 “测试”,查出 form_name 为字段中有查询出有符合内容的数据

 

term:单字段精确查询:

{
	"from": 0,
	"size": 20,
	"query": {
		"bool": {
			"should": [{
					"term": {
						"form_name": "测试"
					}
				}
			]
		}
	}
}

 记录是存在的,但是没有查出来?

为啥呢?

因为form_name 进行了分词。

该如何处理呢?

是否可以让其不分词?语法怎么写? (这个我也不会,貌似一开始插入的时候,就按默认的处理了。无法进行修改了,得删索引,重新建), 有没有简单的方式处理呢?

处理:

加 keyword。因为keyword字段不会进行分词。

"term": {
    "form_name.keyword": "测试"
}

查询索引的结构:

GET es_index/_mapping 

字符的一般有两种结构:

text  带keyword:

"title" : {
	"type": "text",
	"fields": {
		"keyword": {
			"type": "keyword",
			"ignore_above": 256
		}
	}
}

text:

"title" : {
	"type": "text"
}

text:会分词,ES会先把对象进行分词处理,然后再再存入到索引。text就无法使用term查询,可以用match,就无法准确匹配。

keyword:不分词,直接整个存入索引。可以进行完整地查询!默认是256个字符

 

match_phrase :单字段半精确查询

match_phrase是短语搜索,即它会将给定的短语(phrase)当成一个完整的查询条件。

比如查询 “I will make it”,会当成一个完整的短语进行查询;因为mach_phrase类似like模糊查询,会查出含有该查询条件的内容。因此,如果是查询条件是相对固定的内容,比如状态: 开始,进行,竣工等,就可以用match_phrase

GET /basic_index*/_search
{
	"from": 0,
	"size": 20,
	"query": {
		"bool": {
			"should": [{
					"match_phrase": {
						"form_name": "测试"
					}
				}
			]
		}
	}

}

 

terms:多字段精确查询:

terms可以指定多字段进行模糊查询。

GET /basic_index*/_search
{
	"size": 20,
	"from": 0,
	"query": {
		"bool": {
			"should": [{
				"terms": {
					"form_name": ["测试", "运行", "对比"]
				}
			}]
		}
	}
}

 记录是存在的,但是没有查出来? 同term的情况,添加keyword 进行处理

 

总结:

   Es精确查询,单个的用term,多个的用terms,注意查询的内容是否分词,分词的添加keyword。如果查询的内容是相对固定的,可以考虑match_phrase进行处理。

   关联文章: Es 模糊查找

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐