【ElasticSearch】搜索管理

搜索语法

1. 简单搜索

1. 语法

#GET
IP:PORT/索引库名称/type/search?q=

2. DSL搜索

DSL是ES提出的基于JSON的搜索方式,在搜索时传入特定的json格式的数据来完成不同的搜索请求;DSL比URL搜索方式功能强大,在项目中建议使用DSL方式来完成搜索

2.1 查询所有文档
发送:post http://localhost:9200/_search
2.2 分页查询

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

post http://localhost:9200/xc_course/doc/_search
{"from" : 0,
 "size" : 1, 
 "query": { 
 	"match_all": {}
  },
   "_source" : ["name","studymodel"]
 }
2.3 Term Query

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。

{ "query": { 
	"term" : {
		 "name": "spring"
	 } 
  },
  "_source" : ["name","studymodel"]
 }
2.4 根据id精确查询匹配

post: http://127.0.0.1:9200/demo/doc/_search

{
 	"query":{
 	  	"ids":{
 	  		"type:"doc",
 	  		"values":["3","4","10"]
		}
 	}
}
2.5 match Query

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 表示每个词都在文档中出现则才符合条件,

上面搜索过程分解

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

上面使用的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,表示至少有两个词被搜索到文档才算被匹配成功

2.6 mutil query

term query,match query一次只能匹配一个eField;mutil query可以一次匹配多个字段

  1. 基本使用

    # post: http://127.0.0.1:9200/demo/doc/_search
    {
        "query": {
            "match": {
                "discription": {
                    "query": "spring 开发框架",
                    "minimum_should_match": "80%",
                    "fields":["name","description"]
                }
            }
        }
    }
    
  2. 提升权重,在多个字段中,优先显示匹配某个字段的文档

    {
        "query": {
            "match": {
                "discription": {
                    "query": "spring 开发框架",
                    "minimum_should_match": "80%",
                    "fields":["name^10","description"]
                }
            }
        }
    }
    

name^10,表示权重提升10倍,执行上边的查询,name中包括spring关键字的文档会优先排在前面

2.7 布尔查询

布尔查询对应于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"
                    }
                }
            ]
        }
    }
}
2.8 过滤器

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

{
    "_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设置范围过滤

2.9 排序

可以在字段上加上一个或多个排序,支持在keyword、date、float等类型上添加,text类型的字段上不允许添加排序

{
    "_source": [
        "name",
        "studymodel",
        "decription"
    ],
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "price": {
                            "gte": 60,
                            "lte": 100
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "studymodel": "desc"
        },
        {
            "price": "asc"
        }
    ]
}
2.10 高亮显示

高亮显示可以将搜索结果中一个或者多个字段突出显示,以便用户展示关键字的位置,在搜索语句中可以添加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": {}
        }
    }
}

你可能感兴趣的:(ElasticaSearch)