目录
一、Elasticsearch之查询字段过滤
1. 前言
- 在未来,一篇文档可能有很多的字段,每次查询都默认给我们返回全部,在数据量很大的时候,是的,比如我只想查姑娘的手机号,你一并给我个喜好啊、三围什么的算什么?
- 所以,我们对结果做一些过滤,清清白白的告诉elasticsearch
- 对比数据库的select语句,前面介绍的查询都是相当于带where条件的 select * ,下面要介绍的就是相当于select 指定的一些字段了
- 在数据量很大的时候,我们需要什么字段,就返回什么字段就好了,提高查询效率
2. 准备数据
PUT test1/doc/1
{
"name":"顾老二",
"age":30,
"from": "gu",
"desc": "皮肤黑、武器长、性格直",
"tags": ["黑", "长", "直"]
}
3. 结果过滤:_source
- 现在,在所有的结果中,我只需要查看
name
和age
两个属性,其他的不要怎么办?
GET test1/doc/_search
{
"query": {
"match": {
"name": "顾老二"
}
},
"_source": ["name", "age"]
}
- 如上例所示,在查询中,通过
_source
来控制仅返回name
和age
属性。
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.8630463,
"hits" : [
{
"_index" : "test1",
"_type" : "doc",
"_id" : "1",
"_score" : 0.8630463,
"_source" : {
"name" : "顾老二",
"age" : 30
}
}
]
}
}
二、Elasticsearch之高亮查询内容
1. 前言
- 如果返回的结果集中很多符合条件的结果,那怎么能一眼就能看到我们想要的那个结果呢?比如下面网站所示的那样,我们搜索
elasticsearch
,在结果集中,将所有elasticsearch
高亮显示?
[
- 如上图我们搜索百度一样。我们该怎么做呢?
2. 准备数据
PUT test1/doc/4
{
"name":"石头",
"age":29,
"from":"gu",
"desc":"粗中有细,狐假虎威",
"tags":["粗", "大","猛"]
}
3. 默认高亮显示
- 我们来查询:
GET test1/doc/_search
{
"query": {
"match": {
"name": "石头"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
-
上例中,我们使用
highlight
属性来实现结果高亮显示,需要的字段名称添加到fields
内即可,elasticsearch
会自动帮我们实现高亮。 -
结果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.5098256,
"hits" : [
{
"_index" : "test1",
"_type" : "doc",
"_id" : "4",
"_score" : 1.5098256,
"_source" : {
"name" : "石头",
"age" : 29,
"from" : "gu",
"desc" : "粗中有细,狐假虎威",
"tags" : [
"粗",
"大",
"猛"
]
},
"highlight" : {
"name" : [
"<em>石</em><em>头</em>"
]
}
}
]
}
}
- 上例中,
elasticsearch
会自动将检索结果用标签包裹起来,用于在页面中渲染。
4. 自定义高亮显示
- 但是,你可能会问,我不想用
em
标签, 我这么牛逼,应该用个b
标签啊!好的,elasticsearch
同样考虑到你很牛逼,所以,我们可以自定义标签。
GET test1/chengyuan/_search
{
"query": {
"match": {
"from": "gu"
}
},
"highlight": {
"pre_tags": "<b class='key' style='color:red'>",
"post_tags": "</b>",
"fields": {
"from": {}
}
}
}
- 上例中,在
highlight
中,pre_tags
用来实现我们的自定义标签的前半部分,在这里,我们也可以为自定义的标签添加属性和样式。post_tags
实现标签的后半部分,组成一个完整的标签。至于标签中的内容,则还是交给fields
来完成。
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.5753642,
"hits" : [
{
"_index" : "test1",
"_type" : "chengyuan",
"_id" : "1",
"_score" : 0.5753642,
"_source" : {
"name" : "老二",
"age" : 30,
"sex" : "male",
"birth" : "1070-10-11",
"from" : "gu",
"desc" : "皮肤黑,武器长,性格直",
"tags" : [
"黑",
"长",
"直"
]
},
"highlight" : {
"name" : [
"<b class='key' style='color:red'>老</b><b class='key' style='color:red'>二</b>"
]
}
}
]
}
}
- 需要注意的是:自定义标签中属性或样式中的引号一律用英文状态的单引号表示,应该与外部
elasticsearch
语法的双引号区分开