博客
关于我
Elasticsearch 搜索数据基本用法
阅读量:639 次
发布时间:2019-03-15

本文共 3944 字,大约阅读时间需要 13 分钟。

深入搜索

在开始使用 Elasticsearch之前,我们需要涵盖基本工具并对它们进行详细描述。这将允许我们逐步利用 Elasticsearch 搜索数据。然而,经过使用一段时间后,我们可能会发现一些不足:查询匹配不够灵活,结果排名不够精确,跨领域搜索也不够具体。

为了进一步提升,我们需要理解数据以及如何高效地搜索到它们。本章将介绍如何索引和查询数据,从而充分发挥词的相似度(word proximity)、部分匹配(partial matching)、模糊匹配(fuzzy matching)和语言感知(language awareness)的优势。

理解每个查询如何贡献相关度评分(_score》有助于调试我们的查询,确保我们认为的最佳匹配文档能出现在搜索结果榜首,同时减少无关的“长尾”(long tail)内容。搜索不仅仅是全文搜索,我们的大部分数据都是结构化的,如日期和数字。我们将从结构化搜索与全文搜索的结合方式开始,逐步深入了解如何高效地处理结构化数据。

探索你的数据

现在我们已经掌握了基本的搜索知识,接下来我们尝试一些更真实的数据集。我准备了一个关于客户银行账户信息的虚构JSON文档样本。每个文档都有以下模式:

{    "account_number": 0,    "balance": 16623,    "firstname": "Bradshaw",    "lastname": "Mckenzie",    "age": 29,    "gender": "F",    "address": "244 Columbus Place",    "employer": "Euron",    "email": "bradshawmckenzie@euron.com",    "city": "Hobucken",    "state": "CO"}

这个数据集是随机生成的,请忽略其实际意义。

加载示例数据集

你可以通过以下命令下载并索引示例数据集(accounts.json):

curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/bank/account/_bulk?pretty&refresh' --data-binary "@accounts.json"

运行完成后,你可以查询索引状态:

curl 'localhost:9200/_cat/indices?v'

这意味着我们成功将1000个文件索引到bank索引(类型account)中。

搜索API

现在让我们进行一些简单的搜索。Elasticsearch支持两种主要的搜索方式:一种是发送搜索参数作为请求体,另一种是通过URI参数。以下是返回银行索引中所有文档的示例查询:

GET /bank/_search?query=*&sort=account_number:asc&pretty

解析查询:

  • *:匹配所有文档
  • sort=account_number:asc:按account_number升序排序
  • pretty:美化输出格式

响应示例:

{    "took": 63,    "timed_out": false,    "shards": {        "total": 5,        "successful": 5,        "skipped": 0,        "failed": 0    },    "hits": {        "total": 1000,        "max_score": null,        "hits": [            {                "_index": "bank",                "_type": "account",                "_id": "0",                "sort": [0],                "_score": null,                "_source": {                    "account_number": 0,                    "balance": 16623,                    "firstname": "Bradshaw",                    "lastname": "Mckenzie",                    "age": 29,                    "gender": "F",                    "address": "244 Columbus Place",                    "employer": "Euron",                    "email": "bradshawmckenzie@euron.com",                    "city": "Hobucken",                    "state": "CO"                }            },            # 其他文档...        ]    }}

查询语言介绍

Elasticsearch提供了一种强大的JSON式查询语言,称为Query DSL。我们从基本查询开始。

以下是返回account_number为20的示例:

GET /bank/_search{"query":{"match":{"account_number":20}}

以下是返回地址中包含“mill”的示例:

GET /bank/_search{"query":{"match":{"address":"mill"}}

以下是返回地址中包含“mill lane”的示例:

GET /bank/_search{"query":{"match_phrase":{"address":"mill lane"}}

布尔查询

Bool查询允许我们使用布尔逻辑组合多个查询条件。以下是两个字段都包含“mill”的示例:

GET /bank/_search{"query":{"bool":{"must":[{"match":{"address":"mill"}},{"match":{"address":"lane"}}]}}

以下是地址中包含“mill”或“lane”的示例:

GET /bank/_search{"query":{"bool":{"should":[{"match":{"address":"mill"}},{"match":{"address":"lane"}}]}}

以下是地址既不包含“mill”也不包含“lane”的示例:

GET /bank/_search{"query":{"bool":{"must_not":[{"match":{"address":"mill"}},{"match":{"address":"lane"}}]}}

以下是40岁但不是ID州的人的示例:

GET /bank/_search{"query":{"bool":{"must":[{"match":{"age":"40"}}],"must_not":[{"match":{"state":"ID"}}]}}

过滤器

除了match查询,Elaticsearch还提供了filter条款,用于仅进行过滤,而不影响分数计算。以下是返回余额在20000到30000之间的示例:

GET /bank/_search{"query":{"bool":{"must":{"match_all":{}},{"filter":{"range":{"balance":{"gte":20000,"lte":30000}}}}}

聚合

聚合功能允许我们从数据中提取统计信息。以下是按状态分组并计算每个状态的文档数量:

GET /bank/_search{"size":0,"aggs":{"group_by_state":{"terms":{"field":"state.keyword"}}}}

以下是按状态并按平均余额排序的示例:

GET /bank/_search{"size":0,"aggs":{"group_by_state":{"terms":{"field":"state.keyword","order":{"average_balance":"desc"}},"aggs":{"average_balance":{"avg":{"field":"balance"}}}}}

以下是按年龄段和性别分组并计算平均余额的示例:

GET /bank/_search{"size":0,"aggs":{"group_by_age":{"range":{"field":"age","ranges":[{"from":20,"to":30},{"from":30,"to":40},{"from":40,"to":50}]),"aggs":{"group_by_gender":{"terms":{"field":"gender.keyword"},"aggs":{"average_balance":{"avg":{"field":"balance"}}}}}}"}

转载地址:http://dxxlz.baihongyu.com/

你可能感兴趣的文章
Nginx配置实例-动静分离实例:搭建静态资源服务器
查看>>
Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中
查看>>
Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置自带的stub状态实现活动监控指标
查看>>
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>