#GET
IP:PORT/索引库名称/type/search?q=
DSL是ES提出的基于JSON的搜索方式,在搜索时传入特定的json格式的数据来完成不同的搜索请求;DSL比URL搜索方式功能强大,在项目中建议使用DSL方式来完成搜索
发送:post http://localhost:9200/_search
ES支持分页查询,传入两个参数:from和size。 form:表示起始文档的下标,从0开始。 size:查询的文档数量。 发送:
post http://localhost:9200/xc_course/doc/_search
{"from" : 0,
"size" : 1,
"query": {
"match_all": {}
},
"_source" : ["name","studymodel"]
}
Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。
{ "query": {
"term" : {
"name": "spring"
}
},
"_source" : ["name","studymodel"]
}
post: http://127.0.0.1:9200/demo/doc/_search
{
"query":{
"ids":{
"type:"doc",
"values":["3","4","10"]
}
}
}
match Query即为全文检索,它的搜索方式是先将搜索字符串分词,再使用各个词条从索引中搜索;match Query与Term Query区别是march在搜索前会将搜索的关键词分词,再拿各个词语取索引中搜索
# post: http://127.0.0.1:9200/demo/doc/_search
{
"query": {
"match": {
"discription": {
"query": "spring 开发",
"operator": "or"
}
}
}
}
query:搜索关键字,对于英文关键字如果有多个单词则中间要用半角都好分割,而对于中文关键字中间可以用逗号分割也可以不用
operator:or 表示只要有一个词在文档中出现则就符合条件,and 表示每个词都在文档中出现则才符合条件,
上面搜索过程分解:
上面使用的operator = or,表示只要有一个词匹配上得分,如果实现三个词至少有两个词匹配如何实现? 使用mimimum_should_match
可以指定文档匹配词的占比
{
"query": {
"match": {
"discription": {
"query": "spring 开发框架",
"minimum_should_match": "80%"
}
}
}
}
首先会将条件分为:spring、开发、框架三个词
设置 “minimum_should_match”: “80%” 表示,三个词在文档的匹配占比为80%,即3*0.8=2.4,向上取整为2,表示至少有两个词被搜索到文档才算被匹配成功
term query,match query一次只能匹配一个eField;mutil query可以一次匹配多个字段
基本使用
# post: http://127.0.0.1:9200/demo/doc/_search
{
"query": {
"match": {
"discription": {
"query": "spring 开发框架",
"minimum_should_match": "80%",
"fields":["name","description"]
}
}
}
}
提升权重,在多个字段中,优先显示匹配某个字段的文档
{
"query": {
"match": {
"discription": {
"query": "spring 开发框架",
"minimum_should_match": "80%",
"fields":["name^10","description"]
}
}
}
}
name^10,表示权重提升10倍,执行上边的查询,name中包括spring关键字的文档会优先排在前面
布尔查询对应于Lucence的BooleanQuery查询,实现将多个查询组合起来
must:文档必须匹配must所包含的查询条件,相当于"AND"
should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于"OR"
must_not: 文档不匹配的must_not所包含的该查询条件,相当于"NOT"
{
"_source": [
"name",
"studymodel",
"decription"
],
"from": 0,
"size": 1,
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "spring 框架",
"minimum_should_match": "50%",
"fields": [
"name^10",
"description"
]
}
},
{
"term": {
"studymodel": "202003"
}
}
]
}
}
}
过滤是针对搜索的结果进行过滤,过滤器主要的判断的是文档的是否匹配,不去计算和判断文件的匹配度得分,所以过滤器性能比查询的要高,且方便缓存,推荐尽量使用过滤器去实现查询或者过滤器和查询共同使用
{
"_source": [
"name",
"studymodel",
"decription"
],
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "spring 框架",
"minimum_should_match": "50%",
"fields": [
"name^10",
"description"
]
}
}
],
"filter": [
{
"term": {
"studymodel": "202003"
}
},
{
"range": {
"price": {
"gte": 60,
"lte": 100
}
}
}
]
}
}
}
range: 范围过滤,保留大于等于60并且小于等于100的记录
term:匹配过滤,保留studyment等于"202003"的记录
注意:range和term一次只能对一个Fileld设置范围过滤
可以在字段上加上一个或多个排序,支持在keyword、date、float等类型上添加,text类型的字段上不允许添加排序
{
"_source": [
"name",
"studymodel",
"decription"
],
"query": {
"bool": {
"filter": [
{
"range": {
"price": {
"gte": 60,
"lte": 100
}
}
}
]
}
},
"sort": [
{
"studymodel": "desc"
},
{
"price": "asc"
}
]
}
高亮显示可以将搜索结果中一个或者多个字段突出显示,以便用户展示关键字的位置,在搜索语句中可以添加higlight既可实现
{
"_source": [
"name",
"studymodel",
"decription"
],
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "spring 框架",
"minimum_should_match": "50%",
"fields": [
"name^10",
"description"
]
}
}
],
"filter": [
{
"range": {
"price": {
"gte": 60,
"lte": 100
}
}
}
]
}
},
"sort": [
{
"studymodel": "desc"
},
{
"price": "asc"
}
],
"highlight": {
"pre_tags": [
""
],
"post_tages": [
""
],
"fields": {
"name": {},
"description": {}
}
}
}