java使用elastic search入门

Spring Boot 集成Elastic Search SpringBoot 整合 ES,DSL语句和Java实现 阅读详情

转自:https://www.ibm.com/developerworks/cn/java/j-use-elasticsearch-java-apps/

如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于 Lucene 之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。您可以通过标准的 REST API 或从特定于编程语言的客户端库与 Elasticsearch 进行交互。

本教程将展示 Elasticsearch 的实际工作原理。首先从命令行访问该 REST API 来了解它的基本信息。然后设置一个本地 Elasticsearch 服务器,并从一个简单的 Java 应用程序与它交互。请参见 下载 部分,获取有关的示例代码。

前提条件

要理解本教程的所有示例,需要在您的系统上安装 Elasticsearch。下载针对您的平台的 最新 Elastic Search 程序包。将该包解压到一个方便的位置。在 UNIX 或 Linux 上,通过以下命令启动该实例:

1
/elastic-search-dir/bin/elasticsearch

在 Windows 上,运行

1
/elastic-search-dir/bin/elasticsearch.bat

在看到日志消息 started 时,该节点已准备好接受请求。

对于 Java 示例,还需要安装 Eclipse 和 Apache Maven。如果您的系统上还没有它们,请下载和安装它们。

您还需要 cURL。在 Microsoft Windows 上,我使用 Git Bashshell 来运行 cURL。

使用 cURL 执行 REST 命令

可以对 Elasticsearch 发出 cURL 请求,这样很容易从命令行 shell 体验该框架。

“Elasticsearch 是无模式的。它可以接受您提供的任何命令,并处理它以供以后查询。”

Elasticsearch 是无模式的,这意味着它可以接受您提供的任何命令,并处理它以供以后查询。Elasticsearch 中的所有内容都被存储为文档,所以您的第一个练习是存储一个包含歌词的文档。首先创建一个索引,它是您的所有文档类型的容器 — 类似于 MySQL 等关系数据库中的数据库。然后,将一个文档插入该索引中,以便可以查询该文档的数据。

创建一个索引

Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type— 其中 REST VERB 是 PUT、GET或 DELETE。(使用 cURL -X 动词前缀来明确指定 HTTP 方法。)

要创建一个索引,可在您的 shell 中运行以下命令:

1
curl -XPUT "http://localhost:9200/music/"

插入一个文档

要在 /music 索引下创建一个类型,可插入一个文档。在第一个示例中,您的文档包含数据(包含一行)“Deck the Halls” 的歌词,这是一首最初由威尔士诗人 John Ceirog Hughes 于 1885 年编写的传统的圣诞歌曲。

要将包含 “Deck the Halls” 的文档插入索引中,可运行以下命令(将该命令和本教程的其他 cURL 命令都键入到一行中):

1
2
curl -XPUT "http://localhost:9200/music/songs/1" -d '
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }'

前面的命令使用 PUT 动词将一个文档添加到 /songs 文档类型,并为该文档分配 ID 1。URL 路径显示为 index/doctype/ID。

查看文档

要查看该文档,可使用简单的 GET 命令:

1
curl -XGET "http://localhost:9200/music/songs/1"

Elasticsearch 使用您之前 PUT 进索引中的 JSON 内容作为响应:

1
2
{"_index":"music","_type":"songs","_id":"1","_version":1,"found":true,"_source":
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }}

更新文档

如果您认识到日期写错了,并想将它更改为 1886 怎么办?可运行以下命令来更新文档:

1
2
curl -XPUT "http://localhost:9200/music/lyrics/1" -d '{ "name":
"Deck the Halls", "year": 1886, "lyrics": "Fa la la la la" }'

因为此命令使用了相同的唯一 ID 1,所以该文档会被更新。

删除文档(但暂时不要删除)

暂时不要删除该文档,知道如何删除它就行了:

1
curl -XDELETE "http://localhost:9200/music/lyrics/1"

从文件插入文档

这是另一个技巧。您可以使用一个文件的内容来从命令行插入文档。尝试此方法,添加另一首针对传统歌曲 “Ballad of Casey Jones” 的文档。将清单 1 复制到一个名为 caseyjones.json 的文件中;也可以使用示例代码包中的 caseyjones.json 文件(参见 下载)。将该文件放在任何方便对它运行 cURL 命令的地方。(在下载的代码中,该文件位于根目录中。)

清单 1. “Ballad of Casey Jones” 的 JSON 文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
   "artist": "Wallace Saunders",
   "year": 1909,
   "styles": ["traditional"],
   "album": "Unknown",
   "name": "Ballad of Casey Jones",
   "lyrics": "Come all you rounders if you want to hear
The story of a brave engineer
Casey Jones was the rounder's name....
Come all you rounders if you want to hear
The story of a brave engineer
Casey Jones was the rounder's name
On the six-eight wheeler, boys, he won his fame
The caller called Casey at half past four
He kissed his wife at the station door
He mounted to the cabin with the orders in his hand
And he took his farewell trip to that promis'd land
 
Chorus:
Casey Jones--mounted to his cabin
Casey Jones--with his orders in his hand
Casey Jones--mounted to his cabin
And he took his... land"
}

运行以下命令,将此文档 PUT 到您的 music 索引中:

1
$ curl -XPUT "http://localhost:9200/music/lyrics/2" -d @caseyjones.json

在该索引中时,将清单 2 的内容(包含另一手民歌 “Walking Boss”)保存到 walking.json 文件中。

清单 2. “Walking Boss” JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
   "artist": "Clarence Ashley",
   "year": 1920
   "name": "Walking Boss",
   "styles": ["folk","protest"],
   "album": "Traditional",
   "lyrics": "Walkin' boss
Walkin' boss
Walkin' boss
I don't belong to you
 
I belong
I belong
I belong
To that steel driving crew
 
Well you work one day
Work one day
Work one day
Then go lay around the shanty two"
}

将此文档推送到索引中:

1
$ curl -XPUT "http://localhost:9200/music/lyrics/3" -d @walking.json

搜索 REST API

是时候运行一次基本查询了,此查询比您运行来查找 “Get the Halls” 文档的简单 GET 要复杂一些。文档 URL 有一个内置的_search 端点用于此用途。在歌词中找到所有包含单词 you 的歌曲:

1
curl -XGET "http://localhost:9200/music/lyrics/_search?q=lyrics:'you'"

q 参数表示一个查询。

响应是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{"took":107,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max
_score":0.15625,"hits":[{"_index":"music","_type":"songs","_id":"2","_
score":0.15625,"_source":{"artist": "Wallace Saunders","year": 1909,"styles":
["traditional"],"album": "Unknown","name": "Ballad of Casey Jones","lyrics": "Come all you rounders
if you want to hear The story of a brave engineer Casey Jones was the rounder's name.... Come all
you rounders if you want to hear The story of a brave engineer Casey Jones was the rounder's name
On the six-eight wheeler, boys, he won his fame The caller called Casey at half past four He kissed
his wife at the station door He mounted to the cabin with the orders in his hand And he took his
farewell trip to that promis'd land Chorus: Casey Jones--mounted to his cabin Casey Jones--with his
orders in his hand Casey Jones--mounted to his cabin And he took his... land"
}},{"_index":"music","_type":"songs","_id":"3","_score":0.06780553,"_source":{"artist": "Clarence
Ashley","year": 1920,"name": "Walking Boss","styles": ["folk","protest"],"album":
"Traditional","lyrics": "Walkin' boss Walkin' boss Walkin' boss I don't belong to you I belong I
belong I belong To that steel driving crew Well you work one day Work one day Work one day Then go
lay around the shanty two"}}]}}

使用其他比较符

还有其他各种比较符可供使用。例如,找到所有 1900 年以前编写的歌曲:

1
curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:<1900

此查询将返回完整的 “Casey Jones” 和 “Walking Boss” 文档。

限制字段

要限制您在结果中看到的字段,可将 fields 参数添加到您的查询中:

1
curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:>1900&fields=year"

检查搜索返回对象

清单 3 给出了 Elasticsearch 从前面的查询返回的数据。

清单 3. 查询结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
     "took": 6,
     "timed_out": false,
     "_shards": {
         "total": 5,
         "successful": 5,
         "failed": 0
     },
     "hits": {
         "total": 2,
         "max_score": 1.0,
         "hits": [{
             "_index": "music",
             "_type": "lyrics",
             "_id": "1",
             "_score": 1.0,
             "fields": {
                 "year": [1920]
             }
         }, {
             "_index": "music",
             "_type": "lyrics",
             "_id": "3",
             "_score": 1.0,
             "fields": {
                 "year": [1909]
             }
         }]
     }
}

在结果中,Elasticsearch 提供了多个 JSON 对象。第一个对象包含请求的元数据:看看该请求花了多少毫秒 (took) 和它是否超时 (timed_out)。_shards 字段需要考虑 Elasticsearch 是一个集群化服务的事实。甚至在这个单节点本地部署中,Elasticsearch 也在逻辑上被集群化为分片。

继续查看清单 3 中的搜索结果,可以观察到 hits 对象包含:

  • total 字段,它会告诉您获得了多少个结果
  • max_score,用于全文搜索
  • 实际结果

实际结果包含 fields 属性,因为您将 fields 参数添加到了查询中。否则,结果中会包含 source,而且包含完整的匹配文档。_index、_type 和 _id 的用途不言自明;_score 指的是全文搜索命中长度。这 4 个字段始终会在结果中返回。

使用 JSON 查询 DSL

基于查询字符串的搜索很快会变得很复杂。对于更高级的查询,Elasticsearch 提供了一种完全基于 JSON 的特定于领域的语言 (DSL)。例如,要搜索 album 值为 traditional 的每首歌曲,可创建一个包含以下内容的 query.json 文件:

1
2
3
4
5
6
7
{
     "query" : {
         "match" : {
             "album" : "Traditional"
         }
     }
}

然后运行:

1
curl -XGET "http://localhost:9200/music/lyrics/_search" -d @query.json

从 Java 代码使用 Elasticsearch

“Elasticsearch 强大功能会在通过语言 API 使用它时体现出来。”

Elasticsearch 强大功能会在通过语言 API 使用它时体现出来。现在我将介绍 Java API,您将从一个应用程序执行搜索。请参见 下载 部分,获取相关的示例代码。该应用程序使用了 Spark 微型框架,所以可以很快设置它。

示例应用程序

为一个新项目创建一个目录,然后运行(将该命令键入到一行上):

1
2
mvn archetype:generate -DgroupId=com.dw -DartifactId=es-demo
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

要生成一个项目来在 Eclipse 中使用,可通过 cd 进入 Maven 创建的项目目录,并运行 mvn eclipse:eclipse。

在 Eclipse 中,选择 File > Import > Existing Project into Workspace。导航到您使用 Maven 的文件夹,选择该项目,单击Finish。

在 Eclipse 中,您可以看到一个基本的 Java 项目布局,包括根目录中的 pom.xml 文件和一个 com.dw.App.java 主要类文件。将您所需的依赖项添加到 pom.xml 文件中。清单 4 给出了完整的 pom.xml 文件。

清单 4. 完整的 pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" >
   < modelVersion >4.0.0</ modelVersion >
   < groupId >com.dw</ groupId >
   < artifactId >es-demo</ artifactId >
   < packaging >jar</ packaging >
   < version >1.0-SNAPSHOT</ version >
   < name >es-demo</ name >
   < url >http://maven.apache.org</ url >
   < build >
     < plugins >
       < plugin >
         < groupId >org.apache.maven.plugins</ groupId >
         < artifactId >maven-compiler-plugin</ artifactId >
         < configuration >
           < compilerVersion >1.8</ compilerVersion >
           < source >1.8</ source >
           < target >1.8</ target >
         </ configuration >
       </ plugin >
     </ plugins >
   </ build >
   < dependencies >
     < dependency >
     < groupId >com.sparkjava</ groupId >
     < artifactId >spark-core</ artifactId >
     < version >2.3</ version >
</ dependency >
< dependency >
     < groupId >com.sparkjava</ groupId >
     < artifactId >spark-template-freemarker</ artifactId >
     < version >2.3</ version >
</ dependency >
< dependency >
     < groupId >org.elasticsearch</ groupId >
     < artifactId >elasticsearch</ artifactId >
     < version >2.1.1</ version >
</ dependency >
   </ dependencies >
</ project >

清单 4 中的依赖项获取 Spark 框架核心、Spark Freemarker 模板支持和 Elasticsearch。另请注意,我将 <source> 版本设置为 Java 8,Spark 需要该版本(因为它大量使用了 lambda)。

我不知道您的情况,但我不久前构建了许多 RESTful 应用程序,所以为了改变以下步调,您将为应用程序提供一个更加传统的 “提交和加载 (submit-and-load)” UI。

在 Eclipse 中,在导航器中右键单击项目,选择 Configure > Convert to Maven Project,以便 Eclipse 可以解析 Maven 依赖项。转到项目,右键单击该项目,然后选择 Maven > Update Project。

Java 客户端配置

Elasticsearch 的 Java 客户端非常强大;它可以建立一个嵌入式实例并在必要时运行管理任务。但我在这里将重点介绍如何运行针对您已运行的节点的应用程序任务。

运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用。该应用程序可在 Elasticsearch 集群中扮演更加主动或更加被动的角色。在更加主动的情况下(称为 Node Client),应用程序实例将从集群接收请求,确定哪个节点应处理该请求,就像正常节点所做的一样。(应用程序甚至可以托管索引和处理请求。)另一种模式称为 Transport Client,它将所有请求都转发到另一个 Elasticsearch 节点,由后者来确定最终目标。

获取 Transport Client

对于演示应用程序,(通过 App.java 中执行的初始化)选择 Transport Client,并保持 Elasticsearch 执行最低级别的处理:

1
2
Client client = TransportClient.builder().build()
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本例中,您只有一个 localhost 节点。)连接到端口 9300,而不是像之前在 REST API 的 cURL 中一样连接到 9200。Java 客户端将会使用这个特殊端口,使用端口 9200 不起作用。(其他 Elasticsearch 客户端,Python 客户端就是其中之一,将会 使用 9200 来访问 REST API。)

在服务器启动时创建该客户端,并在整个请求处理过程中使用它。Spark 通过 Mustache 模板引擎的 Java 实现来呈现该页面,而且 Spark 定义了请求端点 — 但我不会太多地解释这些简单的用例。(请参见 参考资料,获取 Spark 的详细信息的链接。)

该应用程序的索引页面显示了 Java 客户端的功能:

搜索结果的屏幕截图

UI:

  • 呈现现有歌曲的列表
  • 提供一个添加歌曲的按钮
  • 实现按艺术家和歌词进行搜索
  • 返回突出显示了匹配内容的结果

搜索和处理结果

在清单 5 中,根 URL / 被映射到 index.mustache 页面。

清单 5. 基本搜索
1
2
3
4
5
6
7
8
9
10
Spark.get("/", (request, response) -> {
         SearchResponse searchResponse =
             client.prepareSearch("music").setTypes("lyrics").execute().actionGet();
         SearchHit[] hits = searchResponse.getHits().getHits();
 
             Map< String , Object> attributes = new HashMap<>();
             attributes.put("songs", hits);
 
             return new ModelAndView(attributes, "index.mustache");
         }, new MustacheTemplateEngine());

清单 5 中的有趣部分始于:

1
SearchResponse searchResponse = client.prepareSearch("music").setTypes("lyrics").execute().actionGet();

这一行显示了搜索 API 的简单用法。使用 prepareSearch 方法指定一个索引(在本例中为 music),然后执行查询。查询基本上显示为 “Give me all of the records in the music index.”。另外,将文档类型设置为 lyrics,但在这个简单用例中没有必要这么做,因为索引仅包含一种文档类型。在更大的应用程序,需要执行这种设置。这个 API 调用类似于您之前看到的 curl -XGET "http://localhost:9200/music/lyrics/_search" 调用。

SearchResponse 对象包含有趣的功能(例如命中数量和评分),但就目前而言,您只想要一个结果数组,可使用searchResponse.getHits().getHits(); 获得它。

最后,将结果数组添加到视图上下文中,并让 Mustache 呈现它。Mustache 模板如下所示:

清单 6. index.mustache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< html >
< body >
< form name = "" action = "/search" >
   < input type = "text" name = "artist" placeholder = "Artist" ></ input >
   < input type = "text" name = "query" placeholder = "lyric" ></ input >
   < button type = "submit" >Search</ button >
</ form >
< button onclick = "window.location='/add'" >Add</ button >
< ul >
{{#songs}}
   < li >{{id}} - {{getSource.name}} - {{getSource.year}}
     {{#getHighlightFields}} -
       {{#lyrics.getFragments}}
         {{#.}}{{{.}}}{{/.}}
       {{/lyrics.getFragments}}
     {{/getHighlightFields}}
   </ li >
{{/songs}}
</ ul >
 
</ body >
</ html >

突出显示高级查询和匹配内容

要支持突出显示更高级的查询和匹配内容,可以使用 /search,如下所示:

清单 7. 搜索和突出显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Spark.get("/search", (request, response) -> {
         SearchRequestBuilder srb = client.prepareSearch("music").setTypes("lyrics");
 
         String lyricParam = request.queryParams("query");
         QueryBuilder lyricQuery = null;
         if (lyricParam != null && lyricParam.trim().length() > 0){
             lyricQuery = QueryBuilders.matchQuery("lyrics", lyricParam);
         }
         String artistParam = request.queryParams("artist");
         QueryBuilder artistQuery = null;
         if (artistParam != null && artistParam.trim().length() > 0){
           artistQuery = QueryBuilders.matchQuery("artist", artistParam);
         }
 
         if (lyricQuery != null && artistQuery == null){
           srb.setQuery(lyricQuery).addHighlightedField("lyrics", 0, 0);
         } else if (lyricQuery == null && artistQuery != null){
           srb.setQuery(artistQuery);
         } else if (lyricQuery != null && artistQuery != null){
           srb.setQuery(QueryBuilders.andQuery(artistQuery,
               lyricQuery)).addHighlightedField("lyrics", 0, 0);
         }
 
         SearchResponse searchResponse = srb.execute().actionGet();
 
SearchHit[] hits = searchResponse.getHits().getHits();
 
     Map< String , Object> attributes = new HashMap<>();
     attributes.put("songs", hits);
 
     return new ModelAndView(attributes, "index.mustache");
}, new MustacheTemplateEngine());

在清单 7 中,要注意的第一个有趣的 API 用法是 QueryBuilders.matchQuery("lyrics", lyricParam);。这是您设置对 lyrics 字段的查询的地方。另外要注意的是QueryBuilders.andQuery(artistQuery, lyricQuery),它是将查询的 artist 和 lyrics 部分合并到 AND 查询中的一种方法。

.addHighlightedField("lyrics", 0, 0); 调用告诉 Elasticsearch 生成 lyrics 字段上的搜索命中突出显示结果。第二和第三个参数分别指定无线大小的分段和无限数量的分段。

在呈现搜索结果时,将突出显示结果放入 HTML 中。使用 Elasticsearch 就能生成有效的 HTML,使用 <em> 标记来突出显示匹配字符串所在的位置。

插入文档

让我们来看看如何以编程方式将文档插入索引中。清单 8 给出了添加过程。

清单 8. 插入索引中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Spark.post("/save", (request, response) -> {
       StringBuilder json = new StringBuilder("{");
       json.append("\"name\":\""+request.raw().getParameter("name")+"\",");
       json.append("\"artist\":\""+request.raw().getParameter("artist")+"\",");
       json.append("\"year\":"+request.raw().getParameter("year")+",");
       json.append("\"album\":\""+request.raw().getParameter("album")+"\",");
       json.append("\"lyrics\":\""+request.raw().getParameter("lyrics")+"\"}");
 
       IndexRequest indexRequest = new IndexRequest("music", "lyrics",
           UUID.randomUUID().toString());
       indexRequest.source(json.toString());
       IndexResponse esResponse = client.index(indexRequest).actionGet();
 
       Map< String , Object> attributes = new HashMap<>();
       return new ModelAndView(attributes, "index.mustache");
     }, new MustacheTemplateEngine());

使用 StringBuilder 直接生成一个 JSON 字符串来创建它。在生产应用程序中,可使用 Boon 或 Jackson 等库。

执行 Elasticsearch 工作的部分是:

1
IndexRequest indexRequest = new IndexRequest("music", "lyrics", UUID.randomUUID().toString());

在本例中,使用了 UUID 来生成 ID。

结束语

您已快速掌握了如何从命令行和在 Java 应用程序中使用 Elasticsearch。您现在已经熟悉了索引、查询、突出显示和多字段搜索。Elasticsearch 在一个相对容易使用的包中提供了大量的功能。作为一个项目,Elasticsearch 带来了一些您可能也会感兴趣的结果。具体地讲,所谓的 ELK 堆栈,即 Elasticsearch、Logstash(用于日志管理)和 Kibana(用于报告/可视化),正在迅速发展。

下载资源
相关主题
Elastic Search 6.8.0使用x-pack认证 Elastic Search 6.8.0http请求基于用户名密码方式认证实现 ES的HTTP连接没有提供任何的权限控制措施,一旦部署在公共网络就容易有数据泄露的风险,尤其是加上类似elasticsearch-head这样友好的前端界面,简直让你的数据瞬间裸奔在黑客的眼皮底下。而做一个简单的HTTP认证并不需要从头造轮子,elasticsearch-xpack就提供了基于用户名密码的方式进行安全认... 阅读详情

相关推荐

elastic search新闻搜索实例

elastic search 搜索新闻,去除html标签,中文分词搜索

CoderToSurvive的专栏 1817

java 操作elasticsearch详细总结

基于spring-data的方式,在工程启动的时候,会自动读取实体类相关的注解,自动完成索引的创建,运行下创建索引的测试方法;接下来将对上面的两种操作模式做一个详细的总结,本篇所述的es基于7.6.2版本,配合的kibana也为7.6.2版本。我们知道es最强大的功能就是文档检索了,接下来演示下与es文档查询相关的常用API的操作;在实际开发过程中,对于文档的操作更为的频繁,接下来演示与es文档相关的操作api。导入核心依赖,主要是es的rest依赖,其他的可以根据自己的需要导入;

老男孩的架构路 5759

NR RRC协议(2)---RRC连接建立流程

RRC连接建立目的是建立SRB1 RRC连接建立还用于将初始NAS消息从UE传送到网络 RRC连接的初始阶段期间,不激活AS安全性 RRC连接建立由UE侧发起

crg2046的博客 1957

在 Java 应用程序中使用 Elasticsearch

Elasticsearch 通过将一个易于使用的 REST API 与自动化的集群扩展相结合,在全文搜索领域引起了巨大的轰动。获取从命令 shell 和在 Java™ 应用程序内使用 Elasticsearch 的实用介绍。 如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时

zhangyunpengchang的专栏 3275

高分创新点!Mamba+CNN结合,发顶会首选!

研究摘要 近期视觉领域涌现CNN与Mamba的融合架构,通过双分支设计互补优势。ConvMamba结合CNN的局部特征提取与Mamba的全局建模能力,在ImageNet分类任务中实现90.2%准确率,推理速度提升1.8倍。医学图像方向,PGM-UNet引入提示引导残差Mamba模块,结合多尺度空洞卷积与KANs,显著提升分割精度;遥感领域CM-UNet通过CSMamba块与多尺度注意力聚合模块,有效捕捉长距离依赖。这些工作表明,跨模态轻量化融合与注意力优化是未来重要方向。

m0_73122726的博客 1013

2025年春科研论文写作指导(如何写好科研论文)研究生网课期末考试

希望能帮助到大家

beijieweiyu的博客 5789

ElasticSearch在Java中的使用

ElasticSearch在Java中的使用

qq2444036297的博客 7619

Springboot项目中使用邮箱验证码注册登录的代码实现

本文介绍了在Spring Boot应用中实现邮箱验证码注册和登录功能的完整方案。文章首先概述了三种用户认证方式(邮箱验证码注册/登录和传统密码登录),然后详细说明了实现所需的技术栈(Spring Boot、Spring Security、JWT等)。重点阐述了邮件服务配置、验证码生成与存储的核心实现,包括QQ邮箱授权码获取、Thymeleaf邮件模板处理以及验证码缓存管理。最后展示了发送验证码和用户注册的API实现,为开发者提供了完整的参考方案。该方案兼顾安全性和用户体验,适合现代Web应用的用户认证需求。

BXCQ_xuan的技术专栏 | 实战干货·实践教程·学习笔记 1340

Elasticsearch 在 Java 中的使用教程

Elasticsearch 是一个分布式搜索和分析引擎,基于 Apache Lucene 构建,能够实现实时数据的存储、搜索、和分析。它广泛应用于全文搜索、日志分析、性能监控等领域。Elasticsearch 的核心概念包括文档(document)、索引(index)、和分片(shard)

boydoy1987的专栏 6056

【嵌入式Linux】EC20模块多运营商自适应PPP拨号实战:从IMSI识别到网络配置

本文详细介绍了在嵌入式Linux系统中,如何基于EC20 4G模块实现多运营商自适应PPP拨号。通过解析SIM卡的IMSI识别运营商,并动态配置对应的APN和拨号参数,结合AT指令交互与健壮的pppd脚本,解决了设备跨地域部署时的网络自动连接问题,提升了物联网设备的部署效率和稳定性。

fox11的博客 902

手把手教你用GNU Radio和PlutoSDR搭建FM收音机(附完整流程图)

本文提供了一份详细的实践指南,教你如何使用GNU Radio和PlutoSDR搭建一个功能完整的FM收音机。从软硬件环境准备、核心流程图构建,到运行调试与效果优化,手把手带你完成从射频信号接收、下变频、FM解调到音频输出的全过程,是入门软件定义无线电(SDR)的绝佳实践项目。

weixin_29189377的博客 749

Java操作Elasticsearch的所有方法

使用Java操作Elasticsearch的所有方法 13.1 Elasticsearch简介 Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是json。 a)、索引index,相当于数据库中的database。 b)、类型type相当于数据库中的table。 c)、主键id相当于数据库中记录的主键,是唯一的。 d)、文档 document (相当于一条数据) 文档是ElasticSearch的基本单

weixin_39363116的博客 9887

MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码结构有所调整,使用起来更方便) 深度学习三维重建 MVSNet-ECCV-2018 (源码、pytorch版、原文+注释、译文+批注)Meshlab查看三维点云时 ,使用技巧总结。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2938

什么是Elastic Search (ES) ? | win系统如何安装Elastic Search ? | Java如何引用ES ? | Linux如何操作ES ?

Elastic Search的教程,以及Java如何调用Elastic Search,Linux如何操作Elastic Search,win系统如何安装并且本地启动Elastic Search

Geek_Dream 1309

Power EM与Signal EM解决办法与原理分析

1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有power EM问题,可以叠加多层线和垂直方向补power形成网络降低并联电阻和提供更多电流通路解决,这种方法还可以降低ir drop。3.先进工艺有一个via ladder的方法可以解决power/signal em问题,clock cell出pin绕线或者power rail连接power stripe通过搭梯子的方式连接,原理还是分流。

m0_61544122的博客 4744

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

canal java_超详细canal入门,看这篇就够了

思维导图 本文章已收录到个人博客网站(我爱B站):me.lovebilibili.com前言我们都知道一个系统最重要的是数据,数据是保存在数据库里。但是很多时候不单止要保存在数据库中,还要同步保存到Elastic Search、HBase、Redis等等。这时我注意到阿里开源的框架Canal,他可以很方便地同步数据库的增量数据到其他的存储应用。所以在这里总结一下,分享给各位读者参考~一、什么是...

weixin_36300831的博客 5436

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【elastic search】JAVA操作elastic search

聊一下如何使用JAVA来操作es,如何和spring boot集成。

BugMan的博客 9634

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Elastic:开发者上手指南

你们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。 我们可以按照如下的步骤来学习: 1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍 2)Elasticsearch中的一些重要概念:cluster,n..........................................................

Elastic 中国社区官方博客 17万+

Elastic Search 的安装、使用方式

elasticsearch是一款非常强大的开源搜索引擎,支持的功能非常多。数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。目前仅10万不到的数据量差距就如此明显,如果数据量达到百万、千万、甚至上亿级别,这个性能差距会非常夸张。数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。

2402_84949062的博客 1096

Elastic Stack简介与Elastic Search集群安装

ElasticSearch是一个基于Lucene1的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。Elasticsearch 使用的是标准的 RESTful 风格的 API 和 JSON。

zxnbmk的博客 983

Elastic的Workplace Search如何使用Gmail或Google Drive等数据源

Workplace Search 提供了大量的数据源的集成,我们只需要适当的配置就可以让Workplace Search自动同步数据源上的内容,让我们可以快速查询数据源上我们感兴趣的数据。 但目前官方提供的一些数据源,比如像GitHub、Gmail、Google Drive等,都需要翻墙才能够获取内容 以Gmail举例,当我们按照教程,完成OAuth访问配置,获得Client ID和Client Secret 我们需要将Gmail配置为数据源,并且connect,以获取数据: 我们会发现页面上会提示S

点火三周的专栏 4373

Elastic Search 入门使用说明

ES的安装、配置、与Java项目集成运用

编程思维 1441

[Elastic Search] 一文入门Elastic Search的基本使用

设置自定义的字典在IK分词器中是一个重要的功能,它允许用户根据特定的需求添加或修改词汇。

weixin_51282703的博客 1532

elastic search入门

1.3 下载ElasticSearch安装包。1.1安装JDK,省略,之前已安装过。1、ElasticSearch安装。

heming20122012的专栏 1763

如何使用 Elastic Search Low Level API 构造请求进行搜索

场景: 需要在客户端构造请求调解, 调用 Elastic Search 的 API 取到结果,并且能够使用 ES 的授权机制。 方案: 在

千里之行 1549

Elastic Search分布式存储检索引擎的概述,特点,应用,架构,读写原理,安装与使用

本文重点介绍elastic search技术栈的概述,特点,应用领域,架构,读写流程,安装,使用;

qq_55006020的博客 1211
上一篇: github从入门到上传项目
下一篇: 理解RESTful架构
class_brick
博客等级 码龄12年 223粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值