博客
关于我
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/

你可能感兴趣的文章
NMF(非负矩阵分解)
查看>>
nmon_x86_64_centos7工具如何使用
查看>>
NN&DL4.1 Deep L-layer neural network简介
查看>>
NN&DL4.3 Getting your matrix dimensions right
查看>>
NN&DL4.7 Parameters vs Hyperparameters
查看>>
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named 'pandads'
查看>>