elasticsearch的RESTful API以及C#的使用

发布时间 2023-07-27 10:40:55作者: 朦朦胧胧的月亮最美好

RESTful API
1.RESTful请求方式
RESTful风格是一种基于HTTP协议设计Web API的软件架构风格,它强调使用HTTP动词来表示对资源的操作(GET、POST、PUT、PATCH、DELETE等)

2.RESTful请求elasticsearch

2.1测试elasticsearch是否部署成功
GET http://localhost:9200

如下结果表示访问成功,可以通过RESTful请求继续访问elasticsearch

2.2新建一个索引库
PUT http://localhost:9200/demo

如下结果表示创建成功,创建了一个名为demo的索引库

之后可以用GET请求访问这个索引
GET http://localhost:9200/demo

可以看到mappings映射为空,我们可以通过在put请求时跟特定的请求体设置mappings

先通过
DELETE http://localhost:9200/demo
删除我们刚才创建的索引库

之后
PUT http://localhost:9200/demo
PUT请求加上mappings作为body设置请求体
{ "mappings" : { "properties" : { "name" : { "type" : "text" }, "age" : { "type" : "integer" } } } }

再用GET请求查询既可以看到我们刚设置的请求体

2.3新建一个文档
我们可以通过PUT请求或者POST请求新建一个文档

如果使用PUT请求则需要在请求后著名文档id,使用POST则不需要,es会自动帮我们生成

POST http://localhost:9200/demo/_doc
{ "name":"cooooooookie", "age":20 }

可以看到es自动帮我们生成了id
通过POST请求可以查看我们刚新建的文档 也可以通过GET请求查看
POST http://localhost:9200/demo/_search

还可以通过DELETE删除这个我们刚建立的文档
文档id是"NanmlIkBUWQVg4WNF6xW"
DELETE http://localhost:9200/demo/_doc/NanmlIkBUWQVg4WNF6xW

再次查询可以看到这条记录已经被删除了
POST http://localhost:9200/demo/_search

之后我们可以再使用PUT请求建立一个文档,注意PUT请求建立文档需要注明id,如果不注明id会报错
PUT http://localhost:9200/demo/_doc

注明id后再进行建立
PUT http://localhost:9200/demo/_doc/1

则显示建立成功
PUT请求还可以根据id进行文档的修改
先用GET请求查看我们刚建立的文档
GET http://localhost:9200/demo/_doc/1

之后使用PUT请求修改
PUT http://localhost:9200/demo/_doc/1
{ "age":25 }

再用GET请求查看修改后的文档
发现制定id的文档内容已经被修改
GET http://localhost:9200/demo/_doc/1

2.3查询一个文档
查询涉及到es的分词功能,es自带的分词功能不能支持中文,所以我们新建立一个索引库指定好中文分词器进行search
PUT http://localhost:9200/demo_search

{ "mappings":{ "properties":{ "name": { "type": "text", "analyzer": "ik_smart" }, "age": { "type": "integer" } } } }
我们先多创建一些文档,方便我们进行查询~
{ "took": 12, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 7, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "demo_search", "_id": "PakNlYkBUWQVg4WNzawc", "_score": 1.0, "_source": { "name": "让name承担一下他不该承担的吧", "age": 10 } }, { "_index": "demo_search", "_id": "PqkNlYkBUWQVg4WN9az1", "_score": 1.0, "_source": { "name": "我喜欢吃四川火锅", "age": 10 } }, { "_index": "demo_search", "_id": "P6kOlYkBUWQVg4WNCqz9", "_score": 1.0, "_source": { "name": "我喜欢吃东北锅包肉", "age": 10 } }, { "_index": "demo_search", "_id": "QKkOlYkBUWQVg4WNI6zq", "_score": 1.0, "_source": { "name": "我喜欢吃西湖醋鱼", "age": 13 } }, { "_index": "demo_search", "_id": "QakOlYkBUWQVg4WNU6zV", "_score": 1.0, "_source": { "name": "我喜欢吃西门庆", "age": 15 } }, { "_index": "demo_search", "_id": "QqkOlYkBUWQVg4WNmaxF", "_score": 1.0, "_source": { "name": "西门庆喜欢在火锅游泳", "age": 19 } }, { "_index": "demo_search", "_id": "Q6kOlYkBUWQVg4WN7axy", "_score": 1.0, "_source": { "name": "喜欢看上海的云,吃西湖醋鱼", "age": 20 } } ] } }
介绍一些查询的关键词
以下查询标头都是用
POST http://localhost:9200/demo_search/search
match查询会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到

{ "query": { "match": { "name": "西湖火锅" } } }

{ "took": 3, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.7298446, "hits": [ { "_index": "demo_search", "_id": "QqkOlYkBUWQVg4WNmaxF", "_score": 1.7298446, "_source": { "name": "西门庆喜欢在火锅游泳", "age": 19 } }, { "_index": "demo_search", "_id": "QKkOlYkBUWQVg4WNI6zq", "_score": 1.2019703, "_source": { "name": "我喜欢吃西湖醋鱼", "age": 13 } }, { "_index": "demo_search", "_id": "Q6kOlYkBUWQVg4WN7axy", "_score": 0.9164883, "_source": { "name": "喜欢看上海的云,吃西湖醋鱼", "age": 20 } } ] } }
可以看到包含西湖,火锅的词都被很好的匹配到了,如果我们不指定分词器,使用默认的分词器,那么他就会一个字一个字的分词,会匹配到我喜欢吃西门庆
使用match_phrase则不会对搜索词进行分词
{ "query": { "match_phrase": { "name": "西湖火锅" } } }
这样就什么结果都搜不到了

term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串
{ "query": { "term": { "age": 10 } } }
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "demo_search", "_id": "PakNlYkBUWQVg4WNzawc", "_score": 1.0, "_source": { "name": "让name承担一下他不该承担的吧", "age": 10 } }, { "_index": "demo_search", "_id": "PqkNlYkBUWQVg4WN9az1", "_score": 1.0, "_source": { "name": "我喜欢吃四川火锅", "age": 10 } }, { "_index": "demo_search", "_id": "P6kOlYkBUWQVg4WNCqz9", "_score": 1.0, "_source": { "name": "我喜欢吃东北锅包肉", "age": 10 } } ] } }
range 查询找出那些落在指定区间内的数字或者时间
{ "query": { "range": { "age": { "gte":11, "lt":20 } } } }
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "demo_search", "_id": "QKkOlYkBUWQVg4WNI6zq", "_score": 1.0, "_source": { "name": "我喜欢吃西湖醋鱼", "age": 13 } }, { "_index": "demo_search", "_id": "QakOlYkBUWQVg4WNU6zV", "_score": 1.0, "_source": { "name": "我喜欢吃西门庆", "age": 15 } }, { "_index": "demo_search", "_id": "QqkOlYkBUWQVg4WNmaxF", "_score": 1.0, "_source": { "name": "西门庆喜欢在火锅游泳", "age": 19 } } ] } }

3.C#操作ES

3.1安装NEST包

3.2获取本地es链接
var lowlevelClient = new ElasticLowLevelClient();
3.3
数据插入
var indexResponses = await lowlevelClient.IndexAsync<StringResponse>("index_name","id", PostData.Serializable(data));
3.4
数据删除
var indexResponses = lowlevelClient.DeleteAsync<StringResponse>("index_name", "id");
3.5
数据查询
var indexResponses = lowlevelClient.SearchAsync<StringResponse>("index_name", PostData.Serializable(new { query = new { match = new { name = "西湖火锅" } } }));