目录
目标
掌握精准搜索,包括单值精确搜索和多值精确搜索。本文会列举各种常见的案例,通过这些案例来熟悉精准查询各个参数的功能和使用方法。
ES版本信息
7.17.5
官方文档
Term queryhttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-term-query.html
相关术语和注意事项
使用场景
Term query常用来处理价格、产品ID或用户名等精确值的搜索。特别注意:要避免对text类型字段进行精准查询,因为分词使得精准查询无法搜索到目标文档。推荐对text使用Match query。
单值精准搜索
搜索条件只有一个,且不对搜索条件进行分词,直接做等值搜索。
多值精准搜索
搜索条件有多个,且不对搜索条件进行分词,直接做等值搜索,只要有一个符合就匹配,相当于MySQL中的IN操作。
创建相关的索引和文档(数据用于实战案例)
创建索引
PUT /stu_db
{
"settings": {
"index": {
"analysis.analyzer.default.type": "ik_max_word"
}
}
}
索引文档
PUT /stu_db/_bulk
{ "index": { "_id": "1"} }
{"address": "湖南省长沙市天心区","age":12,"name":"张三","figure":{"height":172.0,"weight":63.5},"mobilePhoneType":"huawei"}
{ "index": { "_id": "2"} }
{"address": "湖南省长沙市芙蓉区","age":13,"name":"诸葛神王","figure":{"height":180.0,"weight":75.5},"mobilePhoneType":"xiaomi"}
{ "index": { "_id": "3"} }
{"address": "广东省广州市白云区","age":14,"name":"北冥沧海","figure":{"height":2.0,"weight":80.5},"mobilePhoneType":"iphone"}
{ "index": { "_id": "4"} }
{"address": "湖北省武汉市江夏区","age":15,"name":"李四","figure":{"height":192.0,"weight":78.5},"mobilePhoneType":"iPhone"}
Term query常见参数实战
基本语法
需求:精确搜索年龄为12的文档。
第一步:实现需求。
GET /stu_db/_search
{
"query": {
"term": {
"age": {
"value": 12
}
}
}
}
#简短写法
GET /stu_db/_search
{
"query": {
"term": {
"age": 12
}
}
}
对text类型字段的处理方法
需求:精确搜索姓名为"北冥沧海"的文档。
第一步:查询name字段的类型,发现它是text类型,子类型是keyword类型。
GET /stu_db/_mapping
第二步:官方文档指出:要避免对text类型字段进行精准查询,因为分词使得精准查询无法搜索到目标文档。此时可以使用keyword类型来精准搜索。
GET /stu_db/_search
{
"query": {
"term": {
"name.keyword": {
"value": "北冥沧海"
}
}
}
}
#简短写法
GET /stu_db/_search
{
"query": {
"term": {
"name.keyword": "北冥沧海"
}
}
}
避免算分
#会计算分数
GET /stu_db/_search
{
"query": {
"term": {
"figure.height": {
"value": 172
}
}
}
}
#不会计算分数,且充分利用缓存。
GET /stu_db/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"figure.height": {
"value": 172
}
}
}
}
}
}
设置关键词是否区分大小写
说明:case_insensitive是term的可选参数,默认为false,表示关键词区分大小写,设置为true表示关键词不区分大小写。该参数在7.10.0开始有效。
需求:分别使用关键词"iphone"和"IPHONE"作为手机品牌的搜索条件,精准搜索文档。
第一步:实现需求。发现"iphone"为条件可以查询出来,而"IPHONE"为条件查询不出来。说明该参数默认区分大小写。
GET /stu_db/_search
{
"query": {
"term": {
"mobilePhoneType": {
"value": "iphone"
}
}
}
}
GET /stu_db/_search
{
"query": {
"term": {
"mobilePhoneType": {
"value": "IPHONE"
}
}
}
}
第二步:设置为true,即关键词不区分大小写。使用关键词"IPHONE"作为手机品牌的搜索条件,精准搜索文档。可以搜索出文档,证明该参数分析正确。
GET /stu_db/_search
{
"query": {
"term": {
"mobilePhoneType": {
"value": "IPHONE",
"case_insensitive":true
}
}
}
}
多值精确搜索
需求:搜索体重包含63.5和75.5的文档。
第一步:实现需求。
GET /stu_db/_search
{
"query": {
"terms": {
"figure.weight":[63.5,75.5]
}
}
}