elasticsearch搜索示例
目录
一、测试及添加数据
1、使用cat health API验证elasticsearch是否正在运行。cat API以比原始JSON更易于阅读的格式返回有关集群和索引的信息。
curl -X GET "localhost:9200/_cat/health?v&pretty"
如果您仅运行单个Elasticsearch实例,则集群状态将保持黄色。单节点群集具有完整的功能,但是无法将数据复制到另一个节点以提供弹性。副本分片必须可用,群集状态为绿色。如果群集状态为红色,则某些数据不可用。
- 对Elasticsearch的请求包含与任何HTTP请求相同的部分:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
<VERB>
适当的HTTP方法或动词。例如,GET,POST, PUT,HEAD,或DELETE。
<PROTOCOL>
无论是http或https。如果您在Elasticsearch前面有一个HTTPS代理,或者您使用Elasticsearch安全功能来加密HTTP通信,请使用后者。
<HOST>
Elasticsearch集群中任何节点的主机名。或者, localhost用于本地计算机上的节点。
<PORT>
运行Elasticsearch HTTP服务的端口,默认为9200。
<PATH>
API端点,可以包含多个组件,例如 _cluster/stats或_nodes/stats/jvm。
<QUERY_STRING>
任何可选的查询字符串参数。例如,?pretty 将漂亮地打印 JSON响应以使其更易于阅读。
<BODY>
JSON编码的请求正文(如有必要)。
2、将JSON文档放入Elasticsearch索引中
1)添加
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
2)查询
curl -X GET "localhost:9200/customer/_doc/1?pretty"
3)批量添加
curl -H "Content-Type: application/json" –X POST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
4)查询所有
curl "localhost:9200/_cat/indices?v"
二、开始搜索
将一些数据添加到Elasticsearch索引后,您可以通过将请求发送到_search端点来对其进行搜索。
1、例如,以下请求检索bank 按帐号排序的索引中的所有文档:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
'
默认情况下,hits
响应部分包含与搜索条件匹配的前10个文档
该响应还提供有关搜索请求的以下信息:
- took – Elasticsearch运行查询多长时间(以毫秒为单位)
- timed_out –搜索请求是否超时
- _shards –搜索了多少个分片以及成功,失败或跳过了多少个分片。
- max_score –找到的最相关文件的分数
- hits.total.value -找到了多少个匹配的文档
- hits.sort -文档的排序位置(不按相关性得分排序时)
- hits._score-文档的相关性得分(使用时不适用match_all)
2、每个搜索请求都是独立的:Elasticsearch在请求中不维护任何状态信息。要翻阅搜索结果,请在您的请求中指定from和size参数。
例如,以下请求的匹配数为10到19:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
'
3、要在字段中搜索特定术语,可以使用match
查询。例如,以下请求搜索该address
字段以查找地址包含mill
或lane
的客户:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match": { "address": "mill lane" } }
}
'
4、要执行词组搜索而不是匹配单个词,请使用 match_phrase代替match。例如,以下请求仅匹配包含短语的地址mill lane:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_phrase": { "address": "mill lane" } }
}
'
5、要构造更复杂的查询,可以使用bool查询来组合多个查询条件。您可以根据需要(must match),期望(should match)或不期望(must not match)指定条件。
例如,以下请求在bank索引中搜索属于40岁客户的帐户,但不包括居住在爱达荷州(ID)的任何人:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
'
布尔查询中的每个must,should和must_not元素称为查询子句。文档满足每个条款must或 should条款的标准的程度有助于文档的相关性得分。分数越高,文档就越符合您的搜索条件。默认情况下,Elasticsearch返回按这些相关性分数排名的文档。
must_not子句中的条件被视为过滤器。它会影响文档是否包含在结果中,但不会影响文档的评分方式。
6、您还可以显式指定任意过滤器,以基于结构化数据包括或排除文档。
例如,以下请求使用范围过滤器将结果限制为余额在20,000美元到30,000美元(含)之间的帐户。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
'
三、分析与汇总结果
Elasticsearch聚合使您能够获取有关搜索结果的元信息,并回答诸如“德克萨斯州有多少个帐户持有人”之类的问题。或“田纳西州的平均帐户余额是多少?” 您可以在一个请求中搜索文档,过滤命中并使用汇总分析结果。
1、例如,以下请求使用terms
汇总将bank
索引中的所有帐户按状态分组,并按降序返回帐户数量最多的十个州:?
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
'
2、您可以组合聚合以构建更复杂的数据汇总。例如,以下请求将一个avg聚合嵌套在先前的 group_by_state聚合中,以计算每个状态的平均帐户余额。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
'
3、您可以通过指定terms聚合内的顺序来使用嵌套聚合的结果进行排序,而不是按计数对结果进行排序:
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
'
除了这些基本的存储统计和指标聚合外,Elasticsearch还提供了专门的聚合,用于在多个字段上操作并分析特定类型的数据,例如日期,IP地址和地理数据。您还可以将单个聚合的结果馈送到管道聚合中,以进行进一步分析。
聚合提供的核心分析功能可启用高级功能,例如使用机器学习来检测异常。