前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速学习-ElasticaSearch6.2.1搜索管理

快速学习-ElasticaSearch6.2.1搜索管理

作者头像
cwl_java
发布2020-01-14 14:57:42
4320
发布2020-01-14 14:57:42
举报
文章被收录于专栏:cwl_Javacwl_Java

7 搜索管理

7.1 准备环境

7.1.1 创建映射

创建xc_course索引库。 创建如下映射

post:http://localhost:9200/xc_course/doc/_mapping

代码语言:javascript
复制
{
	"properties": {
		"description": {
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"name": {
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"pic": {
			"type": "text",
			"index": false
		},
		"price": {
			"type": "float"
		},
		"studymodel": {
			"type": "keyword"
		},
		"timestamp": {
			"type": "date",
			"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis"
		}
	}
}

7.1.2 插入原始数据

向xc_course/doc中插入以下数据:

代码语言:javascript
复制
http://localhost:9200/xc_course/doc/1
{
	"name": "Bootstrap开发",
	"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,是一个非常流行的开发框架,此框架集成了 多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松 的实现一个不受浏览器限制的精美界面效果。",
	"studymodel": "201002",
	"price": 38.6,
	"timestamp": "2018‐04‐25 19:11:35",
	"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg"
}
http://localhost:9200/xc_course/doc/3
{
	"name": "spring开发基础",
	"description": "spring 在java领域非常流行,java程序员都在用。",
	"studymodel": "201001",
	"price": 88.6,
	"timestamp": "2018‐02‐24 19:11:35",
	"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg"
}

7.1.3 简单搜索

简单搜索就是通过url进行查询,以get方式请求ES。 格式:get …/_search?q=… q:搜索字符串。 例子: ?q=name:spring 搜索name中包括spring的文档。

7.3 DSL搜索

DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索时传入特定的json格式的数据来完成不 同的搜索需求。

DSL比URI搜索方式功能强大,在项目中建议使用DSL方式来完成搜索。

7.3.1 查询所有文档

查询所有索引库的文档。 发送:post http://localhost:9200/_search

查询指定索引库指定类型下的文档。(通过使用此方法) 发送:post http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"query": {
		"match_all": {}
	},
	"_source": ["name", "studymodel"]
}

_source:source源过虑设置,指定结果中所包括的字段有哪些。

结果说明: took:本次操作花费的时间,单位为毫秒。 timed_out:请求是否超时 _shards:说明本次操作共搜索了哪些分片 hits:搜索命中的记录 hits.total : 符合条件的文档总数 hits.hits :匹配度较高的前N个文档 hits.max_score:文档匹配得分,这里为最高分 _score:每个文档都有一个匹配度得分,按照降序排列。 . _source:显示了文档的原始内容。

7.3.2 分页查询

ES支持分页查询,传入两个参数:from和size。 form:表示起始文档的下标,从0开始。 size:查询的文档数量。

发送:post http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"from": 0,
	"size": 1,
	"query": {
		"match_all": {}
	},
	"_source": ["name", "studymodel"]
}

7.3.3 Term Query

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。 发送:post http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"query": {
		"term": {
			"name": "spring"
		}
	},
	"_source": ["name", "studymodel"]
}

7.3.4 根据id精确匹配

ES提供根据多个id值匹配的方法: post: http://127.0.0.1:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"query": {
		"ids": {
			"type": "doc",
			"values": ["3", "4", "100"]
		}
	}
}

7.3.5 match Query

1、基本使用

match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。 match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。

发送:post http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"query": {
		"match": {
			"description": {
				"query": "spring开发",
				"operator": "or"
			}
		}
	}
}

query:搜索的关键字,对于英文关键字如果有多个单词则中间要用半角逗号分隔,而对于中文关键字中间可以用 逗号分隔也可以不用。

operator:or 表示 只要有一个词在文档中出现则就符合条件,and表示每个词都在文档中出现则才符合条件。 上边的搜索的执行过程是:

1、将“spring开发”分词,分为spring、开发两个词 2、再使用spring和开发两个词去匹配索引中搜索。 3、由于设置了operator为or,只要有一个词匹配成功则就返回该文档。

2、minimum_should_match 上边使用的operator = or表示只要有一个词匹配上就得分,如果实现三个词至少有两个词匹配如何实现? 使用minimum_should_match可以指定文档匹配词的占比:

比如搜索语句如下:

代码语言:javascript
复制
{
	"query": {
		"match": {
			"description": {
				"query": "spring开发框架",
				"minimum_should_match": "80%"
			}
		}
	}
}

7.3.6 multi Query

上边学习的termQuery和matchQuery一次只能匹配一个Field,本节学习multiQuery,一次可以匹配多个字段。

1、基本使用 单项匹配是在一个field中去匹配,多项匹配是拿关键字去多个Field中匹配。

例子: 发送:post http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"query": {
		"multi_match": {
			"query": "spring css",
			"minimum_should_match": "50%",
			"fields": ["name", "description"]
		}
	}
}

2、提升boost 匹配多个字段时可以提升字段的boost(权重)来提高得分 例子: 提升boost之前,执行下边的查询:

代码语言:javascript
复制
{
	"query": {
		"multi_match": {
			"query": "spring框架",
			"minimum_should_match": "50%",
			"fields": ["name", "description"]
		}
	}
}

通过查询发现Bootstrap排在前边。

提升boost,通常关键字匹配上name的权重要比匹配上description的权重高,这里可以对name的权重提升。

代码语言:javascript
复制
{
	"query": {
		"multi_match": {
			"query": "spring框架",
			"minimum_should_match": "50%",
			"fields": ["name^10", "description"]
		}
	}
}

“name^10” 表示权重提升10倍,执行上边的查询,发现name中包括spring关键字的文档排在前边。

7.3.7 布尔查询

布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。 三个参数: must:文档必须匹配must所包括的查询条件,相当于 “AND” should:文档应该匹配should所包括的查询条件其 中的一个或多个,相当于 “OR” must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT”

发送:POST http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"_source": ["name", "studymodel", "description"],
	"from": 0,
	"size": 1,
	"query": {
		"bool": {
			"must": [{
				"multi_match": {
					"query": "spring框架",
					"minimum_should_match": "50%",
					"fields": ["name^10", "description"]
				}
			}, {
				"term": {
					"studymodel": "201001"
				}
			}]
		}
	}
}

must:表示必须,多个查询条件必须都满足。(通常使用must) should:表示或者,多个查询条件只要有一个满足即可。 must_not:表示非。

7.3.8 过虑器

过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过 虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。

过虑器在布尔查询中使用,下边是在搜索结果的基础上进行过虑:

代码语言:javascript
复制
{
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
		"bool": {
			"must": [{
				"multi_match": {
					"query": "spring框架",
					"minimum_should_match": "50%",
					"fields": ["name^10", "description"]
				}
			}],
			"filter": [{
				"term": {
					"studymodel": "201001"
				}
			}, {
				"range": {
					"price": {
						"gte": 60,
						"lte": 100
					}
				}
			}]
		}
	}
}

range:范围过虑,保留大于等于60 并且小于等于100的记录。 term:项匹配过虑,保留studymodel等于"201001"的记录。

注意:range和term一次只能对一个Field设置范围过虑。

7.3.9 排序

可以在字段上添加一个或多个排序,支持在keyword、date、float等类型上添加,text类型的字段上不允许添加排序。 发送 POST http://localhost:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
		"bool": {
			"filter": [{
				"range": {
					"price": {
						"gte": 0,
						"lte": 100
					}
				}
			}]
		}
	},
	"sort": [{
		"studymodel": "desc"
	}, {
		"price": "asc"
	}]
}

7.3.10 高亮显示

高亮显示可以将搜索结果一个或多个字突出显示,以便向用户展示匹配关键字的位置。 在搜索语句中添加highlight即可实现,如下: Post: http://127.0.0.1:9200/xc_course/doc/_search

代码语言:javascript
复制
{
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
		"bool": {
			"must": [{
				"multi_match": {
					"query": "开发框架",
					"minimum_should_match": "50%",
					"fields": ["name^10", "description"],
					"type": "best_fields"
				}
			}],
			"filter": [{
				"range": {
					"price": {
						"gte": 0,
						"lte": 100
					}
				}
			}]
		}
	},
	"sort": [{
		"price": "asc"
	}],
	"highlight": {
		"pre_tags": ["<tag1>"],
		"post_tags": ["</tag2>"],
		"fields": {
			"name": {},
			"description": {}
		}
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7 搜索管理
    • 7.1 准备环境
      • 7.1.1 创建映射
      • 7.1.2 插入原始数据
      • 7.1.3 简单搜索
    • 7.3 DSL搜索
      • 7.3.1 查询所有文档
      • 7.3.2 分页查询
      • 7.3.3 Term Query
      • 7.3.4 根据id精确匹配
      • 7.3.5 match Query
      • 7.3.6 multi Query
      • 7.3.7 布尔查询
      • 7.3.8 过虑器
      • 7.3.9 排序
      • 7.3.10 高亮显示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档