目录
掌握精准搜索,包括单值精确搜索和多值精确搜索。本文会列举各种常见的案例,通过这些案例来熟悉精准查询各个参数的功能和使用方法。
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"}
需求:精确搜索年龄为12的文档。
第一步:实现需求。
- GET /stu_db/_search
- {
- "query": {
- "term": {
- "age": {
- "value": 12
- }
- }
- }
- }
-
- #简短写法
- GET /stu_db/_search
- {
- "query": {
- "term": {
- "age": 12
- }
- }
- }
需求:精确搜索姓名为"北冥沧海"的文档。
第一步:查询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]
- }
- }
- }