📜  Elasticsearch-搜索API(1)

📅  最后修改于: 2023-12-03 15:00:35.181000             🧑  作者: Mango

Elasticsearch-搜索API

Elasticsearch是一个开源的分布式搜索和分析引擎,它能快速地处理海量数据,支持实时搜索和分析数据,是当前最热门的数据搜索引擎之一。Elasticsearch的搜索API是其核心功能之一,提供了丰富的搜索操作和可定制的参数,方便我们对搜索的结果进行处理和优化。

安装和配置

安装Elasticsearch的方式有很多,我们可以选择使用官方提供的安装包,也可以使用brew安装或手动编译源代码。安装完成后,我们需要配置一些参数以确保Elasticsearch正确地运行。

在本地测试环境中,我们可以只使用单个节点运行Elasticsearch,无需进行复杂的集群配置。为了确保节点能够工作正常,我们需要修改一些默认的参数,在elasticsearch.yml中进行配置。以下是常见的一些参数:

cluster.name: my_cluster # 集群名称
node.name: my_node # 节点名称
network.host: 0.0.0.0 # 监听所有网络地址
http.port: 9200 # HTTP监听端口

修改完参数后,我们可以启动Elasticsearch来测试是否配置正确:

bin/elasticsearch

如果看到以下信息,则表示Elasticsearch已经正确启动:

[2021-12-01T14:23:20,755][INFO ][o.e.n.Node               ] [my_node] initialized
[2021-12-01T14:23:20,757][INFO ][o.e.n.Node               ] [my_node] starting ...
[2021-12-01T14:23:22,052][INFO ][o.e.t.TransportService   ] [my_node] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}
[2021-12-01T14:23:22,013][INFO ][o.e.h.HttpServer         ] [my_node] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}
[2021-12-01T14:23:22,067][INFO ][o.e.n.Node               ] [my_node] started
搜索API基础

Elasticsearch的搜索API是通过HTTP请求来操作的,我们可以向Elasticsearch服务器发送HTTP请求,搜索数据、聚合数据等。以下是一个简单的搜索请求示例:

curl -XGET 'http://localhost:9200/my_index/_search?q=title:book'

上述请求表示在my_index索引中搜索标题为"book"的文档。我们可以看到请求中有几个参数:

  • XGET: HTTP请求方法,这里使用GET方法。
  • /my_index/_search: Elasticsearch的搜索路由路径,my_index是索引名称,_search表示执行搜索操作。
  • q=title:book: 查询参数,表示搜索标题为"book"的文档。

当我们发送这个请求时,Elasticsearch会返回一个JSON格式的响应,包含搜索结果和其他相关信息。以下是一个示例响应:

{
  "took": 13, // 搜索耗时
  "timed_out": false, // 是否超时
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821, // 最大得分
    "hits": [
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821, // 当前文档得分
        "_source": {
          "title": "book",
          "author": "John Doe",
          "content": "This is a book about Elasticsearch."
        }
      }
    ]
  }
}

这个响应包含了搜索结果中的一个文档,其中_score属性表示当前文档的得分,得分越高,表示当前文档与搜索条件越匹配。

搜索API进阶

Elasticsearch的搜索API提供了丰富的搜索操作和可定制的参数,以下是一些常用的进阶操作:

查询DSL

Elasticsearch支持基于查询DSL的灵活查询,DSL查询可以用JSON格式表示,支持范围查询、通配符查询、近似查询、全文查询等。以下是一个示例查询:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "book" } },
        { "range": { "page_count": { "gte": 100 } } }
      ],
      "should": [
        { "match": { "author": "John" } }
      ],
      "minimum_should_match": 1
    }
  }
}

这个查询表示必须包含"book"关键词,并且页数大于等于100,也可能包含作者为"John"的书。

分页和排序

我们可以使用fromsize参数来进行分页操作,也可以使用sort参数进行排序。

curl -XGET 'http://localhost:9200/my_index/_search?from=0&size=10&sort=page_count:desc'

这个请求表示从索引my_index中检索10个文档,从第1个文档开始,并按页数降序排序。

聚合操作

Elasticsearch支持丰富的聚合操作,可以根据不同的聚合条件进行分组、计数、统计、平均值等。

{
  "aggs": {
    "author_count": {
      "cardinality": {
        "field": "author.keyword"
      }
    }
  }
}

这个聚合操作表示统计my_index中的作者数量,可以用于推荐系统和数据统计分析等场景。

总结

Elasticsearch的搜索API提供了基础和丰富的搜索操作和可定制的参数,可以用于各种领域的搜索和聚合场景。在使用Elasticsearch的搜索API时,我们需要根据实际情况进行调整和优化,以获取更好的搜索效果。