需求索引员工文档检索文档简单搜索使用DSL语句查询更复杂的搜索全文搜索短语搜索高亮搜索分析
参考文档
需求xxx公司需要创建一个员工目录,促进人文关怀和用于实时协同工作。
支持包含多值标签、数值、以及全文本的数据检索任一员工的完整信息允许结构化搜索,比如查询 30 岁以上的员工允许简单的全文搜索以及较复杂的短语搜索高亮搜索结果中的关键字能够利用图表管理分析这些数据 索引员工文档
第一个需求存储员工数据,每一个文档代表一个员工,在es中存储数据的行为就叫索引。
在es中,文档归属于一种类型(type),而这些类型存在于索引(index)中。相对于传统DB来说:
es集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每一个文档包含多个字段(Fields)(列)。
所以创建员工目录,操作如下:
每个员工索引一个文档,文档包含该员工的所有信息。每个文档都将是 employee 类型 。该类型位于 索引 xxx 内。该索引保存在我们的 Elasticsearch 集群中。
PUT /xxx/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
可以看到path包含三部分信息:
| 名字 | 说明 |
|---|---|
| xxx | 索引名 |
| employee | 类型名 |
| 1 | 员工的ID |
请求实体(JSON文档),包含这个员工的所有信息。他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。
需求:检索单个员工信息。在es中,只要执行HTTP GET请求并指出文档的"地址"——索引、类型和ID即可。
GET http://121.40.135.149:9200/xxx/employee/1
{
"_index": "xxx",
"_type": "employee",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
简单搜索
1、搜索全部员工的请求
GET http://121.40.135.149:9200/xxx/employee/_search
依然使用xxx索引和employee类型,但是结尾使用关键字 _search取代原来的文档ID。
相应类容的hits数组中包含我们所有的 三个文档,默认返回前10个结果。
2、搜索姓氏中包含“Smith”的员工
http://121.40.135.149:9200/xxx/employee/_search?q=last_name:Smith
请求中依旧使用_search关键字,然后将查询语句传递给参数 q=。
使用DSL语句查询把之前的query-string参数改为使用请求体替代,使用JSON构造,并使用一个match查询。
1、搜索姓氏为Smith的员工,年龄大于30;
添加一个过滤器;
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
全文搜索
1、搜索喜欢攀岩的员工
Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。第一个最高得分的结果很明显:John Smith 的 about 属性清楚地写着 “rock climbing” 。
但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about 属性里提到了 “rock” 。因为只有 “rock” 而没有 “climbing” ,所以她的相关性得分低于 John 的。
短语搜索精确匹配一系列单词或者_短语_ 。 比如, 我们想执行这样一个查询,仅匹配同时包含 “rock” 和 “climbing” ,并且 二者以短语 “rock climbing” 的形式紧挨着的雇员记录。
为此对 match 查询稍作调整,使用一个叫做 match_phrase 的查询:
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
高亮搜索
再次执行前面的查询,并增加一个新的 highlight 参数:
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}
分析
Elasticsearch 有一个功能叫聚合(aggregations),允许我们基于数据生成一些精细的分析结果。
举个例子,挖掘出员工中最受欢迎的兴趣爱好:
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
结果:
可以看到,两位员工对音乐感兴趣,一位对林业感兴趣,一位对运动感兴趣。这些聚合的结果数据并非预先统计,而是根据匹配当前查询的文档即时生成的。



