elasticsearch搜索示例

目录

 

一、测试及添加数据

二、开始搜索

三、分析与汇总结果


一、测试及添加数据

1、使用cat health API验证elasticsearch是否正在运行。cat API以比原始JSON更易于阅读的格式返回有关集群和索引的信息。

curl -X GET "localhost:9200/_cat/health?v&pretty"

elasticsearch搜索示例
如果您仅运行单个Elasticsearch实例,则集群状态将保持黄色。单节点群集具有完整的功能,但是无法将数据复制到另一个节点以提供弹性。副本分片必须可用,群集状态为绿色。如果群集状态为红色,则某些数据不可用。

  1. 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字段以查找地址包含milllane的客户:

 

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地址和地理数据。您还可以将单个聚合的结果馈送到管道聚合中,以进行进一步分析。

 

聚合提供的核心分析功能可启用高级功能,例如使用机器学习来检测异常。